數組名本身是個地址常量,但是某些特殊情況下它的語義可以發生改變。例如sizeof(a),這時a表示整個數組對象(這里指語法對象,不是指類的實例)而不是這個常量本身。基於這個語義,對數組名取地址也是合法的,對於數組a來說&a的結果等於a這個地址常量本身的值。這是C/C++標准委員會為了維護語法對象a作為一個左值(l-value)總可以取地址這條原則的妥協。
1 #include <stdio.h>
2 int main(void)
3 {
4 char str[] = "world";
5 char * pstr = "world";
6 printf("%d %d",sizeof(str),sizeof(pstr));
7 getchar();
8 return 0;
9 }
運行結果6 4。
解釋:
char str[] = "world";
這里初始化不限定長度,而"world"包含結束符'\0'后為6個字符,因此初始化str的長度是6;又因為char數組中每個元素(char變量)占用1個字節的空間,所以str[]數組的大小是6字節。
char *pstr = "world";
由於pstr是指針,無論是否指向字符串,指向什么字符串,sizeof(pstr)等於sizeof(int),32位平台上等於4。
造成差別的原因:
這里char str[] = "world";聲明並定義了一個數組str[](當然,C語言的語法不允許在定義之外這樣引用整個數組,以下這樣的寫法只是為了區分語義),之后標識符str有雙重語義:一是類型為char* const的地址常量,它的值等於數組中首個元素的地址,即str等價於(char* const)&str[0];二是表示整個str[]數組這個語法對象。在sizeof(str)中,str表示的含義是str[],因此返回整個數組的大小(這個大小在之前的數組定義中已經確定了);而pstr只是個指針,sizeof(pstr)只能返回指針本身占用的字節數而不能確定為它指向的內容分配的空間的大小。
(注意,地址常量絕不是指針,類型不同!雖然在函數的參數傳遞過程中,地址常量可以退化成對應的指針。這里LZ和2L顯然由於這個錯誤理解導致對數組的sizeof()結果判斷有誤。)
關於數組名語義規定以及“數組名實際上就表示一個指針(
錯的!!!!)”的原因 以后需要注意哈···