指標是其值等於乙個記憶體位址的乙個變數。它「指向」記憶體中的乙個位置。可以通過在宣告中,在變數名前面放置乙個*,將乙個變數宣告為乙個指標變數。如下的**把ppointerint宣告為指向記憶體中儲存乙個整數的變數:
int *ppointint;
int a = 9;
int *b;
b=&a;
**解釋:
第一行將a宣告為乙個int變數,編譯器拿出4個位元組來儲存a,並且將其初始化為9。
第二行將b宣告為乙個指向int的指標。
第三行使用取址運算子&來獲取a的位址,然後將a的位址賦值給b。
一元運算子*(叫做「求值」或「解引用」運算子),通過使用指向乙個記憶體位置的指標變數,老設定或者獲取記憶體位置的記憶體。可以這樣看,把表示式*ppointint看作是乙個別名,即針對儲存在ppointint的內容中的任何記憶體位置的另乙個名稱。表示式*ppointint可以用來設定或者獲取該記憶體位置的內容。
int a;
int c;
int *b;
a = 9;
b = &a;
c = *b;
*b = 10;
指標在 c 中用來引用動態分配的記憶體。指標也用來避免將大塊的記憶體,
例如陣列和結構(將在本章稍後介紹),從乙個程式的一部分複製到另一部分。例如,可以 把指向結構的乙個指標傳遞給函式,而不是把乙個較大的結構傳遞給函式。函式隨後使用指 針來訪問結構。隨後我們還會看到,objective-c 物件也總是通過指標來引用。
通用指標
宣告為 void 的指標變數,是乙個通用指標。
1. void *genericpointer;
1. inta=9;
2. void *genericpointer; 3. genericpointer = &a;
然而,試圖從乙個通用指標獲取乙個值,將導致乙個錯誤發生,因為編譯器沒辦法知道 如何解釋通用指標所表示的位址的位元組:
1. inta=9;
2. int b;
3. void *genericpointer;
4. genericpointer = &a;
5. b = *genericpointer; // wrong - won't compile
要通過 void*指標獲取乙個值,必須將其轉換為指向乙個已知型別的指標:
1. inta=9;
2. int b;
3. void *genericpointer;
4. genericpointer = &a;
5. b = *((int*) genericpointer) ; // ok - b is now 9
強制轉換運算子(int*)迫使編譯器將 genericpointer 看做是指向乙個整數的指標 。
c 不會檢查乙個指標變數是否指向記憶體的乙個有效區域。在 c 程式設計中錯誤地使用指標, 可能會比其他錯誤原因引發更多的程式崩潰。
C語言基礎歸納 注釋
注釋是程式設計師的啟示性表示。編譯器會忽略注釋。c支援兩種格式的注釋 跟在兩個斜槓 後面,知道改行結束之前的所有內容,都是一條注釋。例如 this is a comment.在 和 之間的任何內容,也是一條注釋 this is the other style of comment.這種形式的注釋可以...
C語言基礎歸納 注釋
注釋是程式設計師的啟示性表示。編譯器會忽略注釋。c支援兩種格式的注釋 跟在兩個斜槓 後面,知道改行結束之前的所有內容,都是一條注釋。例如 this is a comment.在 和 之間的任何內容,也是一條注釋 this is the other style of comment.這種形式的注釋可以...
C語言基礎歸納 陣列
c 陣列的宣告,首先是陣列的型別和陣列名,然後是乙個方括號,方括號中是陣列元素的數目 1.int a 100 通過將元素的索引放到陣列名稱後面的 中,可以訪問陣列的單個元素 1.a 6 9 索引是基於0 的。在前面的例子中,合法的索引在0 99。訪問c 陣列時系統不會在兩端進行邊界檢查。c 允許做如...