歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 數組的指針特性

數組的指針特性

日期:2017/3/1 9:43:07   编辑: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