[英]Finding confusion in pointer in c
#include<stdio.h>
int main(){
int a = 320;
char *ptr;
ptr =( char*)&a;
printf("%d",*ptr);
return 0;
}
我只是想知道有什么用(char*)
? 如果我使用(int*)
而不是那個怎么辦?
你的變量是整數類型,即int a = 320;
你的指針是字符類型,即char *ptr;
字符指針只能指向字符類型變量,但是你的代碼中想要指向一個整數變量,那怎么可能呢? 通過這行代碼: ptr =( char*)&a;
它做的是通過使其成為字符類型,顯式地或強制地(無論你想要調用什么)類型轉換指針varble。
讓我們稍微改變一下程序:
int main() {
int a = 0x12345678; // put hexadecimal value 12345678 into a
char *charptr = (char*)&a;
int *intptr = &a;
printf("%x\n", *charptr); // %x prints in hexadecimal
printf("%x\n", *intptr);
return 0;
}
在一個小端系統上,輸出將是:
78
12345678
&a
是的存儲器地址a
變量。 charptr
是一個指向char
的指針 intptr
是一個指向int
的指針 第二個輸出12345678
很明顯,但第一個輸出78
並不那么明顯。
在一個小端系統上,內存中的int a
如下所示:
+----+
| 78 | <---- both 'charptr' and 'intptr' point here
+----+
| 56 |
+----+
| 34 |
+----+
| 12 |
+----+
地址&a
處的char(或字節)是0x78,因此如果取消引用charptr
指針,則得到0x78
。
在大端系統上,我們有:
+----+
| 12 | <---- both 'charptr' and 'intptr' point here
+----+
| 34 |
+----+
| 56 |
+----+
| 78 |
+----+
第一個輸出是12
而不是78
。
在這一行
char *charptr = (char*)&a;
(char*)
被稱為強制轉換,它告訴編譯器將&a
視為指向char
的指針。
沒有演員:
char *charptr = &a;
你將得到一個編譯器警告,例如incompatible types - from 'int *' to 'char *'
,因為你試圖將指向int
的指針指向一個指向char
的指針。
如果你這樣寫:
char *charptr = (int*)&a;
那么你也會得到一個編譯器警告incompatible types - from 'int *' to 'char *'
。 反正在這種情況下, (int*)
投是無用的,因為&a
已經是一個指針int
。
調用變量ptr
不會使它成為指針。 如果你想讓它成為一個指針,它必須用* ie int *ptr;
或char *ptr;
將類型為&a
的指針轉換為char
類型只是愚蠢的,因為它們是完全不同的東西。 使用(int *)
不會改變&a
的類型,所以你不需要把它放進去,但是你的編譯器會告訴你ptr
完全是用於存儲&a
的值的錯誤類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.