假設我們有一個陣列char a[] = "abcd"。當我列印以下內容時:
printf("%p\n", a);
printf("%p\n", &a);
printf("%p\n", &a[0]);
printf("%p\n", a[0]);
我得到以下結果:
0061FF1B
0061FF1B
0061FF1B
00000061
這意味著它a[0]與%a[0]或指向的記憶體地址不同a。這對我來說真的很困惑。我想有人指出了區別這些指標之間,不論是否a[0] 是/衰變為指標。
uj5u.com熱心網友回復:
a[0]沒有指向任何地方,因為它不是指標而是char物件。你撒謊printf并告訴它它是一個指標,當它不是。這是程式中未定義的行為錯誤。
現在碰巧 0x61 是'a'.
關于代碼中的其他行:無論何時在運算式或函式呼叫中使用,陣列都會“衰減”為指向其第一個元素的指標。當這種衰減不發生時,很少有例外 - 使用&地址運算子就是其中之一。
因此:printf("%p\n", a);衰減到指向第一個元素的指標,它 100% 等效于printf("%p\n", &a[0]);。
如果printf("%p\n", &a);衰減不會發生,但您會獲得陣列本身的地址。在 C 中,陣列只不過是一堆元素,沒有其他開銷,因此陣列的地址將始終與第一個元素的地址相同。
uj5u.com熱心網友回復:
用g 編譯代碼時,會發現如下警告
main.cpp: In function ‘int main()’:
main.cpp:7:21: warning: format ‘%p’ expects argument of type ‘void*’, but argument 2 has type ‘int’ [-Wformat=]
printf("%p\n", a[0]);
~~~~^
這里,aand &a[0] 指向字串第一項的地址,而 a[0] 是一個字符。您列印[0] ASCII為0x00000061用%p。
uj5u.com熱心網友回復:
char a[] = "abcd"
- Array
a在運算式中使用時,將轉換為指向陣列第一個元素的指標,即&a[0](此規則很少有例外)。 &a是陣列的地址a,在數值上與陣列的第一個元素的地址相同,&a[0]但不同之處在于它們的型別。的型別&a[0]是char *而的型別&a是char (*) [5]。&a[0]是陣列第一個元素的地址a。a[0]是字符陣列的第一個元素a。
這意味著 a[0] 與 %a[0] 或 a 指向的記憶體地址不同。.......... a[0] 是否/衰減為指標。
a[0]不是指標,它a是字符陣列的第一個元素'a'。請注意,使用陣列名稱時會發生衰減。
列印時a[0],您應該使用格式說明符%c。錯誤的格式說明符printf()導致未定義的行為。此外,格式說明符%p期望引數應該是指向 的指標void。您應該將強制轉換指標引數輸入到void *- printf("%p\n", (void*)a);。
uj5u.com熱心網友回復:
printf("%p\n", &a[0]);
printf("%p\n", a[0]);
在第一種情況下,您正確列印了 的第一個元素的地址a。
在第二種情況下,您要求 printf 列印一個指標,但您將char.
char 會自動轉換為 int(由于 printf 的簽名,其中包含...)。
函式原型宣告符中的省略號表示在最后一個宣告的引數之后停止引數型別轉換。默認引數提升是在尾隨引數上執行的
printf 列印61(正是 ASCII 代碼)的事實是因為在您的計算機上指向 object 的指標int具有相同的位數,或者因為它0在整數旁邊有s,其中 printf 讀取指標值。
但是傳遞 printf 一個型別并檢測它列印其他型別是未定義的行為。
uj5u.com熱心網友回復:
在 C 陣列中變數就像地址
char a[] = "abcd";
// it is all same
// a == &a == &a[0]
// &(a 1) == &a[1]
// so roughly say 'a' is pointer to address of first element of array
// and a[0] or a[1] is a value.
// this is more appropriate way to express a[0]
printf("%c\n", a[0]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327471.html
下一篇:在多線性陣列周圍添加一行和一列
