陣列、指標、函式之間的關係
陣列
int a[5];
定義了一個數組,其中包含了5個int型別資料,我們可以用a[0],a[1],a[2]…等訪問這些元素
sizeof(a)為整個元素大小,為20。
sizeof(a[0])是第一個元素的大小,為4。
sizeof(a[5]),值為4。在這裡沒有出錯是因為sizeof是關鍵字,只是訪問這個值的大小,並不會去執行。
sizeof(&a[0])值為4,因為取出首元素地址,地址大小都為4個位元組。+1會跳過一個元素。
sizeof(&a)值為4,整個陣列的地址,地址大小為4個位元組。+1會跳過整個陣列。
指標
int *p
定義一個指標變數p,大小為4個位元組。這個變數p指向對應的一塊實體記憶體。
*p將得到對應實體記憶體內的資料。
陣列與指標
陣列與指標之間並沒有任何的關係。只不過他們可以用彼此的方法來訪問各自對應的資料。千萬不要把他們當做等價的。
比如:
char *p = "abcdef";
char a[] = "123456";
我們可以用指標的形式訪問陣列a的內容:
*(a+4):這樣就訪問到陣列a中的數字“5”;
也可以用陣列的形式訪問指標所指向字串的內容:
p[4]:這樣就訪問到指標p所指向字串中的“e”;
指標陣列
指標陣列:首先他是一個數組,陣列的元素都是指標。可以這樣理解”好孩子”指的關鍵字是”孩子”,”孩子好”的關鍵字是”好”。
int * p1[10];//指標陣列
陣列名為p1[10];
去掉陣列名p1[10]就是型別,int *就是每個元素的型別。
陣列指標
陣列指標:是一個指標,它指向一個數組。指向陣列的首地址。
int (*p2)[10];//陣列指標
注意[]的優先順序高於*:p2將先於[]結合,所以我們應該將*p2用括號括起來讓他們先結合。這樣才是陣列指標。
函式指標
函式指標,顧名思義,就是函式的指標。他是一個指標,指向一個函式。
int (*fun1)(int x, int y);
fun1是一個指標變數,指向一個函式,這個函式有兩個整型的引數,返回值也是一個整型。
那麼我們怎樣使用它呢:
將其解引用,然後再傳對應的引數:(*fun)(1,2);
其實這裡fun前面的“*”多寫幾個也不會出錯。
甚至於不寫“*”也是可以的。
因為fun前面的*只是個擺設,但是寫上會增加程式碼的易讀性與美觀性,所以我們還是將其加上比較好。
函式指標陣列
舉個例子
char *(*pf[3])(char *p);
頂一個韓函式指標陣列,他是一個數組,陣列名為pf,裡面儲存了三個指向函式的指標,這些指標只想一些返回值型別為指向字元的指標、引數為一個指向字元的指標的函式。這是一個指標陣列,是陣列。
指向函式指標陣列的指標
這是一個指標,指向一個數組,這個數組裡面儲存的都是指向函式的指標。比如:
int (*(*pf)[3](int);
在這裡pf是一個指標,這個指標指向了一個數組,這個陣列包含了三個元素,每個元素都是指向函式的指標,這些指標指向一些返回型別為整型,引數為整型。