2016-03-28 116 views
-1

我試圖運行這段代碼,但是編譯器返回以下警告:類型轉換爲常量指針

int c=23; 
int *const a=&c; 
printf("%d",(int)a); 

警告:投從指針不同大小的整數[-Wpointer-to-int-cast]

printf("%d",(int)a); 
+0

'了'是一個常量指針爲int,這是一個警告,不是一個錯誤。但是,問題是 - 你想達到什麼目的? –

+0

你的問題是什麼? –

+0

如果你必須,正確的整型指針類型是'uintptr_t'和'intptr_t'。但是,因爲你似乎更多地處在C經歷的開始階段,所以儘量避免演員陣容。 –

回答

0

您已聲明a作爲常量指針,但您試圖將其打印爲int。使用%p符,以打印指針的地址,並投出您的指針爲void,就像這樣:

printf ("%p", (void *) a); 
0

,您會收到警告,因爲類型不匹配後,編譯器必須將其轉換爲打印和信息迷路了。

如果你想打印指針的物理地址,使用%p和轉換指針到void *

printf("%p", (void *) a); 

如果你想打印指針的內容(到它的指向),則必須取消對它的引用:

printf("%d", *a); 

記住,訪問內容,使用*。否則,你使用指針而不是其內容。獲取非指針變量的地址:&

0

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

相關問題