今天在ChinaUnix下看到一篇文章,討論一些關於數組名和指標的關係,原帖的連結為:
http://bbs.chinaunix.net/thread-871769-1-994.html
感覺樓主寫的文字還是挺不錯的,不過裡面未免有些內容有些誤導,在此談一些我個人的看法。
Exp1:
#include <iostream.h>
int main(int argc, char* argv[])
{
char str[10];
char *pStr = str;
cout << sizeof(str) << endl;
cout << sizeof(pStr) << endl;
return 0;
}
/*
1、數組名不是指標
我們先來推翻"數組名就是指標"的說法,用反證法。
證明 數組名不是指標
假設:數組名是指標;
則:pStr和str都是指標;
因為:在WIN32平台下,指標長度為4;
所以:第6行和第7行的輸出都應該為4;
實際情況是:第6行輸出10,第7行輸出4;
所以:假設不成立,數組名不是指標
*/
這是文章裡面的證明,首先這裡證明雖然能說的過去,但是這不能作為:數組名不是指標的證明。
因為如果我們把str聲明為:
char str[4]
那麼這個證明就不嚴密了。
數學邏輯推理,不能這麼經不起推敲,反證法必須能排除所有情況。
Exp2:
1 #include <iostream.h>
2 void arrayTest(char str[])
3 {
4 cout << sizeof(str) << endl;
5 }
6 int main(int argc, char* argv[])
7 {
8 char str1[10] = "I Love U";
9 arrayTest(str1);
10 return 0;
11 }
12 /*
13
14 程式的輸出結果為4。不可能吧?
15
16 一個可怕的數字,前面已經提到其為指標的長度!
17
18 結論1指出,資料名內涵為數組這種資料結構,在arrayTest函數體內,str是數組名,那為什麼sizeof的結果卻是指標的長度?這是因為:
19
20 (1)數組名作為函數形參時,在函數體內,其失去了本身的內涵,僅僅只是一個指標;
21
22 (2)很遺憾,在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。
23
24 所以,資料名作為函數形參時,其全面淪落為一個普通指標!它的貴族身份被剝奪,成了一個地地道道的只擁有4個位元組的平民。
25
26 以上就是結論4。
27 */
這裡有一點必須說明: 雖然聲明函數頭的時候,採用的是數組的形式聲明,但是編譯器在處理的時候,直接把str解釋成指標變數。
這也就是為什麼可以在形式參數聲明變長度數組的原因。
即: char str[] ————> char *str
C語言中,我們知道C89明確規定,不能定義變長數組。在C99裡面雖然支援變長數組,但是也是有限的支援,這個有興趣的
朋友可以自己去討論。
但是由於上面描述的解釋原因,因此可以定義變長的數組形式參數。同時說明一點,這裡 sizeof str 實際進行的操作還是返回的
是一個char 型指標的位元組長度。
Exp3:
1 //如果C/C++程式可以這樣寫:
2
3 int[10] intArray;
4 cout << sizeof(intArray) ;
5
6 /*
7 我們就都明白了,intArray定義為int[10]這種資料結構的一個執行個體,可惜啊,C/C++目前並不支援這種定義方式。
8
9 */
這裡,有一點也許可能很奇怪的特性,我就不多說了,有興趣的朋友,可以看看這裡是否有一些特殊的特性存在呢。
總結一句:
數組名表示的是數組儲存的首地址,並且是一個const value;不是一個左值。至於其他的理解那就是各位見仁見智了。
說的對與不對,請大家跟帖評論。