c語言中對陣列名取位址會發生什麼?

時間 2021-05-14 15:53:59

1樓:

陣列名本質是指標...

我個人不建議這樣理解,我也可以說指標本質是整型數,整型數本質是010101.

intarr[10

];cout

<

(arr

).name

()<<

endl

;//int [10] 長度為10的存有int的陣列

cout

<

arr).

name

()<<

endl

;//int (*) [10] 指向(長度為10的存有int的陣列)的指標

cout

<

arr[

0]).

name

()<<

endl

;//int*

cout

<

(arr

)<<' '<<

sizeof(*&

arr)

<<' '<<

sizeof(&

arr)

<<' '<<

sizeof(&

arr[0])

<

A10_i

PA10_i

Pi40 40 8 8

*/陣列是陣列,指標是指標,這是兩個東西,只不過大多時候陣列轉化為指標. 就像有指向整型的指標,也有指向整型陣列的指標.

assert(&arr == arr)預設情況下,gcc會給你警告,g++會報錯,因為他們的型別不同,且沒有對應的隱式型別轉換,即A_i不能隱式型別轉換為PA_i.

assert(&arr[0] == arr)為真,因為A10_i可以隱式型別轉化為Pi .

assert((void*)(arr) == (void*)(&arr))對他們進行型別轉換之後,斷言為真

int (*parr)[10] = &arr;,你可以使用parr去修改它所指向的陣列中的內容,這是因為雖然parr和arr的型別不同,但是他們的位址是一樣,而operator是通過位址偏移得到的,這兩者偏移得到的位址相同.

此外,陣列(內建陣列,非std::array)不允許拷貝,賦值,比如int barr[10] = arr或者int barr[10]; barr = arr;在標準中都是錯誤的.

因此,陣列若是作為引數進行值傳遞,不得不型別轉化為指標(也就是"退化"),雖然型別變了,但是用起來一樣(除了sizeof等等).

void

foo(

intparr

)//int *parr / int parr[10] 都是一樣的

foo(

arr);

//Pi

//i//arr是int [10],傳引數時候隱式型別轉換成了int * ,A10_i -> P_i

void

foo(

int(

*parr

))//foo(arr); //c++中報錯,原因見上文assert部分

foo(

&arr

);//PA_i

//A_i

//這裡丟失了陣列大小的資訊,若要保留需要手動指明,引數改為 int (*parr)[10]

如有錯誤,望您指正.

2樓:笨羊

這裡直接理解乙個結論:

通常陣列名看成乙個常量指標,和首元素的位址一樣, 型別是const char *。

charstr

="sssssss"

;char*p

=str

;char*p1

=&str[0];

// 這裡可以看到,str退化成了乙個char型指標。而不是陣列指標。

2. 特殊情況,如當&str時,返回的是乙個常量陣列指標,型別是 char (*)

char

str[6]

="ssssss"

;char(*

p)[6]

=&str;

// 注意這裡是&str,因為如果是str,返回的是const char *型別,

// 與陣列指標型別(char (*))不匹配

3. char *p與char (*p)[6]型別不同,但首位址一樣

printf("%p\n",str);

printf("%p\n",&str);

3樓:麥弗遜式獨立懸架

自問自答,這篇部落格解析得很詳細:

4樓:暮無井見鈴

str 本身是指代陣列物件的左值,型別是 char[10] ,並非固定的位址。它可以隱式轉換成 char* 型別的值(指向 str[0] ),這個值在陣列物件存在期間是恆定的。

&str 是 char(*)[10] 型別的指標值,指向 str 。因為物件的位址數值上等於其首位元組的位址,所以 str[0] 與 str 的位址相等。

(另外這裡輸出指標值的格式說明嚴格來說是錯的,詳見 https://en.cppreference.com/w/c/io/fprintf)

5樓:任衛

這麼理解,陣列名只是乙個編譯期存在的概念,是乙個假的指標,真的指標在執行時在記憶體是要有它的位置的,而陣列名沒這個待遇,只在編譯期存在,它沒有地方存駐也就不存在取位址這個操作,而它本身又是位址值,就決定無論多少重取位址就都是那個位址值得了。

6樓:wellxia

請看這個回答

7樓:「已登出」

陣列的本質是乙個指標,你對乙個陣列取位址結果是這個陣列的第乙個元素的指標,你直接把陣列當指標用,他也是第乙個元素的指標。不光char陣列,任何陣列都一樣。你自己試試就好了。

指標要學好哦。

c語言中為什麼一維陣列名可以賦值給乙個普通的指標,二維陣列名卻不可以賦值給乙個指向指標的指標?

yihonge 可以,不過有編譯 警告罷了。警告是在提示你可能存在潛在問題,而不是不能這樣做,你完全可以強制轉換。編譯器行為罷了,就像char s hello 其實字串常量應該是const char 但是C編譯器偏偏沒有警告,C 編譯器就會有警告,因為C 的型別檢查比C嚴格。至於為什麼有警告 拋個問...

C 語言中陣列 arr 和 arr 對應的位址為什麼一樣?

題主初學吧,真要搞懂的話,詳細看看c的發展史跟各個時期的標準制定。對於型別的隱式轉換其實一直是c的最大的優點靈活,也是乙個缺點,容易出問題。很多程式的溢位問題都是出在這個上面。所以就初學者而言,理解到最高票答案的那個程度就可以了。把問題記下來,等你以後接觸的書籍越來越多,越靠近底層,你會對c有更深的...

c中,陣列名跟指標有區別嗎?

西門吹牛 include include char test1 char test2 int main char test1 warning address of stack memory associated with local variable p returned Wreturn stack...