【轉】陣列的指標特性——陣列名何時不退化成指標?何時退化成指標
阿新 • • 發佈:2019-01-12
地址:https://blog.csdn.net/dengheCSDN/article/details/78110957
從一道小題下手(該考點曾被騰訊等大公司作為基礎筆試題考過)
#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++; // 正確的