基于約定 int (*o)[5]=&s; 是指標 o 指向具有 5 個元素的陣列的正確方法。我們也可以在這個陳述句中寫這個 s int (*p)[10]=s; 但是為什么在 int (*o)[5]=&s 處優先使用 &s; 因為他們都給出相同的輸出。
#include <stdio.h>
int main()
{
int s[5]={10,1,2,3,4};
int (*p)[10]=s;
printf("%d\n",*p);
printf("%d\n",**p);
printf("%d\n",&s);
printf("\n");
int (*o)[5]=&s;
printf("%d\n",*o);
printf("%d\n",**o);
printf("%d",&s);
return 0;
}
這個程式的輸出是:
-593812272
10
-593812272
-593812272
10
-593812272
uj5u.com熱心網友回復:
這是無效的:
int s[5]={10,1,2,3,4};
int (*p)[10]=s;
因為您正在使用 type 運算式初始化型別變數int (*)[10](指向int大小為 10的陣列的指標)int *。這些型別不兼容。
雖然這很好:
int (*o)[5]=&s;
因為初始化器的型別與變數的型別匹配。
此外,在列印指標值時,您應該使用%p格式說明符并將引數強制轉換為void *. 格式說明符與其相關引數不匹配會觸發未定義的行為。
uj5u.com熱心網友回復:
這條線
int (*p)[10]=s;
是不正確的。int *由于陣列指示符隱式轉換為s指向其第一個元素的指標,因此初始化器具有該型別。并且左手邊和右手邊的兩個指標不兼容。所以編譯器應該發出一條訊息。
這條線
int (*o)[5]=&s;
是正確的。初始化器的型別int ( * )[5]與初始化指標的型別相同o。
注意要輸出一個指標的值,你必須使用轉換說明符%p。否則,使用轉換說明符%d輸出指標會呼叫未定義的行為。
所以例如而不是這些電話
printf("%d\n",*o);
//...
printf("%d",&s);
你必須寫
printf("%p\n", ( void *)*o);
//...
printf("%p\n", ( void * )&s);
該運算式*o產生陣列 s 的 lavlue,然后隱式轉換為指向其第一個元素的指標。
運算式的值*o和表達的&s是相同的,因為它是存盤由所述陣列的占有程度的地址。但是它們的型別是不同的。用作呼叫引數的第一個運算式printf具有型別,int *而第二個運算式具有型別int ( * )[5]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338864.html
