歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

數組的指針特性

從一道小題下手(該考點曾被騰訊等大公司作為基礎筆試題考過),

 #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++;  // 正確的

C++對象數組的實例學習 http://www.linuxidc.com/Linux/2014-06/102590.htm

C語言向有序數組中插入一個數使該數組仍保持有序 http://www.linuxidc.com/Linux/2014-05/102409.htm

C語言用一維數組和二維數組打印楊輝三角 http://www.linuxidc.com/Linux/2014-05/102382.htm

C語言 字符數組和字符串 http://www.linuxidc.com/Linux/2014-05/101926.htm

C++指針與數組的聯系和區別 http://www.linuxidc.com/Linux/2014-05/101537.htm

Copyright © Linux教程網 All Rights Reserved