1. 程式人生 > >【轉】陣列的指標特性——陣列名何時不退化成指標?何時退化成指標

【轉】陣列的指標特性——陣列名何時不退化成指標?何時退化成指標

地址: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種情況中,陣列不會退化成指標,

  1. 使用sizeof(a)的時候,所以上面sizeof(a)的結果為6位元組

  2. 對陣列名取地址操作:&a。&a的型別為pointer to array of 6 chars,而對字串指標取地址結果為pointer to pointer to char.

  3. 使用字串初始化陣列的時候也不會退化。

其它情況都會退化成“指向陣列首元素的指標”,比如:

  1. 陣列名做函式引數時,a都會退化成&a[0]指標。如上面的size函式和printf函式中的a[]都是這種情況
  2. 二維陣列,char s[10][8]陣列的首元素(得理解這個首元素,從一維陣列的角度看的)是一維陣列s[0],因此退化成&s[0]指標

陣列定義字串和指標定義字串的區別

  1. 使用數字定義的字串只分配字串所需的空間(上例中為6個位元組),數字名沒有單獨的儲存空間;使用指標定義字串,除了字串佔用的空間,還要為指標變數分配對應的空間。
  2. 陣列退化成指標為“常量指標”,不可更改,而直接指向字串的指標可修改,如
char a[10] = "China";
char *p = "China";
a++;   // 錯誤的
p++;   // 正確的