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陣列,任何陣列都一樣。你自己試試就好了。 指標要學好哦。 yihonge 可以,不過有編譯 警告罷了。警告是在提示你可能存在潛在問題,而不是不能這樣做,你完全可以強制轉換。編譯器行為罷了,就像char s hello 其實字串常量應該是const char 但是C編譯器偏偏沒有警告,C 編譯器就會有警告,因為C 的型別檢查比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...c語言中為什麼一維陣列名可以賦值給乙個普通的指標,二維陣列名卻不可以賦值給乙個指向指標的指標?
C 語言中陣列 arr 和 arr 對應的位址為什麼一樣?
c中,陣列名跟指標有區別嗎?