(4)解析c的宣告語句
在繼續探索c指標之前,有必要來解析下c語言中複雜的宣告語法。
只需要記住兩則:乙個原則,乙個規則。
原則:先看標示符。
規則:運算子優先順序是規則。
舉例說明
1.最簡單的 int array[3];
結論:array是陣列,陣列規模是3,元素型別是int。
解析過程:先看標示符:array,只有乙個運算子,那麼array就是陣列,元素型別是int,完了。
2.難一點的
(1)陣列指標 int(*array)[3];
結論:array是一指標,指向一陣列,陣列規模是3,陣列中元素型別int。
解析過程:先看標示符:array,由於使用了括號運算子,只能先解析(*array):說明array是一指標。解析完了的,就可拋棄,那麼只剩下,說明指標指向的是一陣列,剩下的不解釋了。
(2)指標陣列 int *array[3];
結論:array是一陣列,陣列規模是3,陣列中元素型別是int*。
解析過程:先看標示符:array,由於優先順序高於*,故array先與結合:說明array是一陣列。只剩下乙個*,說明陣列中存放的是指標,指標指向的型別是int,也就是說陣列中存放的元素型別是int*。
看來只差乙個(),意義完全不同。
陣列指標和指標陣列的記憶體示意圖:
指標陣列、陣列指標總結
指標陣列:首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是
「儲存指標的陣列
」的簡稱。
陣列指標:首先它是乙個指標,它指向乙個陣列。在
32位系統下永遠是佔
4個位元組,至於它指向的陣列佔多少位元組,不知道。它是
「指向陣列的指標
」的簡稱。
3.再複雜一點的
函式指標 int (*pfun)(int,int);
結論:pfun是一函式指標,即pfun指向乙個函式,該函式有兩個引數,引數型別是int、int,並且函式的返回值的型別是int。
解析過程:先看標示符:pfun,由於使用了括號運算子,只能先解析(*pfun):說明pfun是一指標。現只剩下(int,int),進一步說明pfun指向的是一函式,該函式有兩引數,型別都是int,最後的int,說明函式的返回值型別是int。
4.更加複雜一點
int *(*pfun[3])(int, void (*)(int, int*));
關於typedef
typedef的作用是為乙個已有的型別取乙個新的名字:定義別名。
如,在資料結構與演算法系列經常看到
typedef int elemtype;
於是,在可以使用int的地方,也可使用elemtype替代,如語句 elemtype data;同樣表達著int data;的含義。
typedef更重要的用處是簡化型別名,如
typedef struct node
node, *pnode;
這裡使用typedef定義了多個別名,自此,可以直接使用node宣告乙個結構體型別,使用pnode宣告乙個指向該結構體型別的指標,結構體型別的成員組成如上所示。
除此之外,typedef也常用於複雜的宣告,如
typedef int(*p)(int, char);
解析這種宣告的方法是,完全按照上述所講的c的宣告方法解析即可。此處p就是函式指標,該函式原型是int (int, char);
再如,typedef int f(void);
此時,f是函式型別,該函式引數為空,返回int。
故,宣告 f f;就是宣告了int f(void);
專欄目錄:
娓娓道來c指標 8 開發可變引數函式
8 開發可變引數函式 在c語言中,可變引數的函式極其常見,如常用的printf 可變引數函式的一般形式如下 返回值型別 函式名 型別1 引數1,型別2 引數2,型別n 引數n,如上所示,這是乙個典型的可變引數樣式,它共有n個確定的引數,最後的.表示可變引數的含義。必須指出.必須位於最後,並且它至少要...
娓娓道來c指標 3 指標和陣列
3 指標和陣列 在c中指標和陣列似乎有著千絲萬縷的關係。其實它們不是一回事 指標是指標,陣列是陣列,兩者不相同。說它們有關係,不過是因為常見這樣的 int main int n sizeof array sizeof int int p array int i for i 0 i n i print...
娓娓道來c指標 3 指標和陣列
3 指標和陣列 在c中指標和陣列似乎有著千絲萬縷的關係。其實它們不是一回事 指標是指標,陣列是陣列,兩者不相同。說它們有關係,不過是因為常見這樣的 cpp view plain copy print int main int n sizeof array sizeof int int p array...