C語言學習趣事_20_關於數組名與指標的討論

來源:互聯網
上載者:User

     今天在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;不是一個左值。至於其他的理解那就是各位見仁見智了。

說的對與不對,請大家跟帖評論。

    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.