陣列的指標特性——陣列名何時不退化成指標?何時退化成指標
阿新 • • 發佈:2019-02-16
從一道小題下手(該考點曾被騰訊等大公司作為基礎筆試題考過),
#include <stdio.h> int size(char a[10]) { return sizeof(a); } int main(void) { char a[] = {'C','h','i','n','a','\0'}; char *p = "China"; char *q = a; printf("sizeof(a)=%d\n", sizeof(a)); printf("sizeof(p)=%d\n", sizeof(p)); printf("sizeof(q)=%d\n", sizeof(q)); printf("size(a)=%d\n", size(a)); return 0; }
在32位機的編譯環境下,對C語言很熟悉的人一眼就能看出結果為:
sizeof(a)=6
sizeof(p)=4
sizeof(q)=4
size(a)=4
基於本小題,主要考究以下幾點:
陣列名退化成指標
僅在以下3種情況中,陣列不會退化成指標,
-
使用sizeof(a)的時候,所以上面sizeof(a)的結果為6位元組
-
對陣列名取地址操作:&a。&a的型別為pointer to array of 6 chars,而對字串指標取地址結果為pointer to pointer to char.
-
使用字串初始化陣列的時候也不會退化。
其它情況都會退化成“指向陣列首元素的指標”,比如:
-
陣列名做函式引數時,a都會退化成&a[0]指標。如上面的size函式和printf函式中的a[]都是這種情況
-
二維陣列,char s[10][8]陣列的首元素(得理解這個首元素,從一維陣列的角度看的)是一維陣列s[0],因此退化成&s[0]指標
陣列定義字串和指標定義字串的區別
-
使用數字定義的字串只分配字串所需的空間(上例中為6個位元組),數字名沒有單獨的儲存空間;使用指標定義字串,除了字串佔用的空間,還要為指標變數分配對應的空間。
-
陣列退化成指標為“常量指標”,不可更改,而直接指向字串的指標可修改,如
char a[10] = "China"; char *p = "China"; a++; // 錯誤的 p++; // 正確的