我試圖運行這段代碼,但是編譯器返回以下警告:類型轉換爲常量指針
int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:投從指針不同大小的整數
[-Wpointer-to-int-cast]
printf("%d",(int)a);
我試圖運行這段代碼,但是編譯器返回以下警告:類型轉換爲常量指針
int c=23;
int *const a=&c;
printf("%d",(int)a);
警告:投從指針不同大小的整數
[-Wpointer-to-int-cast]
printf("%d",(int)a);
您已聲明a
作爲常量指針,但您試圖將其打印爲int
。使用%p
符,以打印指針的地址,並投出您的指針爲void,就像這樣:
printf ("%p", (void *) a);
,您會收到警告,因爲類型不匹配後,編譯器必須將其轉換爲打印和信息迷路了。
如果你想打印指針的物理地址,使用%p
和轉換指針到void *
:
printf("%p", (void *) a);
如果你想打印指針的內容(到它的指向),則必須取消對它的引用:
printf("%d", *a);
記住,訪問內容,使用*
。否則,你使用指針而不是其內容。獲取非指針變量的地址:&
。
c表示存儲器中的一個地址,它是整數的第一個字節 - 在這種情況下,編號23 a代表存儲器中另一個地址,它是指針的第一個字節 - 在這種情況下,保存地址c(不是在C值,因爲你使用&ç這意味着它的地址)
打印出的meaningfull方式的printf如果你使用這四個printf語句必須使用指針格式%p
:
printf("%p\n", a);
printf("%p\n", &c);
printf("%d\n", *a);
printf("%d\n", c);
你會得到這樣的事情:
0x7ffc080a3f24 ('a' contains a pointer which is the address of 'c')
0x7ffc080a3f24 (&c is the address of 'c')
23 (*a, dereferencing the pointer contained in 'a' provides the value held by the address held by 'a')
23 (and 'c' is the value held at the address &c)
注意,你也會,如果你這樣做會得到一個警告:
printf("%p\n", (int) a);
警告:投從指針不同大小的整數[-Wpointer- to-int-cast]
,因爲您正在爲指針'a'使用正確的格式說明符,但您已將其轉換爲整數類型。雖然int和一個指針都是「整數」,但它們是不同大小的整數。
如果忽略警告並運行代碼,打印的值是不正確的,但你可以看到,它已被截斷: 0x80a3f24
'了'是一個常量指針爲int,這是一個警告,不是一個錯誤。但是,問題是 - 你想達到什麼目的? –
你的問題是什麼? –
如果你必須,正確的整型指針類型是'uintptr_t'和'intptr_t'。但是,因爲你似乎更多地處在C經歷的開始階段,所以儘量避免演員陣容。 –