這個問題在這里已經有了答案: 為什么陣列的地址等于它在 C 中的值? (6 個回答) 20 小時前關閉。
如果我有一個 int 陣列intArr[4]并獲得它指向的地址,就像這樣
printf("%p\n", intArr,);
然后得到陣列的地址
printf(“%p\n”, &intArr);
兩個陳述句都回傳相同的地址
0xffffcc14
0xffffcc14
然后,當它通過intArr[0]或 * intArr取消參考時,它會給出一個整數值。
所以我想知道發生了什么讓陣列看起來好像在同一個記憶體位置同時保存了兩個東西:一個指向自身的指標值和一個元素值?
uj5u.com熱心網友回復:
你宣告的陣列
intArr[4];
實際上是一個命名的記憶體范圍。所以陣列的地址和它的第一個元素的地址就是陣列所占用的記憶體范圍的地址。
運算式&intArr和intArr在呼叫中使用的唯一區別printf是它們的型別。第一個運算式具有指標型別int ( * )[4],第二個運算式具有指標型別,int *但運算式生成的值彼此相等。
在這次通話中
printf("%p\n", intArr,);
陣列指示符被隱式轉換為指向其第一個元素的指標。
在運算式中使用的陣列(例如在sizeof運算子中使用它們)會隱式轉換為指向其第一個元素的指標。
例如,如果你會寫
printf( "%zu\n", sizeof( intArr ) );
你會得到陣列的大小。
另一方面,如果你要寫
printf( "%zu\n", sizeof( intArr 0 ) );
您將獲得指標的大小,因為在此運算式中intArr 0,陣列指示符被隱式轉換為指向其第一個元素的指標。
至于這些運算式intArr[0],*intArr然后第一個運算式的求值就像*( intArr 0 )是一樣的*intArr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409917.html
標籤:
上一篇:指向另一個陣列并在最后釋放記憶體的指標是否被視為C 中的記憶體泄漏?
下一篇:`int(*q)[m][n]=(int(*)[m][n])p;`這種型別轉換是否可行,其中p是普通整數指標`int*p`,它指向矩陣的基地址[復制]
