1. 程式人生 > >陣列、指標、函式之間的關係

陣列、指標、函式之間的關係

陣列

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是一個指標,這個指標指向了一個數組,這個陣列包含了三個元素,每個元素都是指向函式的指標,這些指標指向一些返回型別為整型,引數為整型。