c語言強制轉換指針
『壹』 c語言,指針變數強制類型轉換
在32位系統里CHAR佔一個位元組,INT*佔4個位元組,
你把原來一個位元組的硬分配成4個位元組的,那就把無用數據塞進d裡面去了
比如內存里(太久沒弄,這些知識忘了很多,如有錯誤請見諒)
0001230a00102300
|b|-------------------------本來B只佔了這點內存
|d|-------------------------然後你硬把它分配給了4位元組的D
裡面多了3位元組的無用數據,那就得到了一個讓你莫名奇妙的數。
『貳』 c語言 指針類型強制轉換
%x 默認輸入類型為int
所以傳過去的值實際上是0xaa(*p的值)但是當做int的時候會擴展
0xaa最高位為1所以會當做負數擴展為0xffffffaa
『叄』 關於c語言的指針強制轉化
int *p=(int *)0x
這個是將指針變數p指向一個絕對地址
而地址只是一個數值,需要轉成指針類型才能與p匹配
『肆』 c語言指針強制類型轉換
一個指針做算數加減的時候,字面上的加一或者減一,實際增加或者減少的值是其指向類型的空間大小
也就是說,p+1,實際增長的值是sizeof(*p)
所以,將p轉為int*後,加10,實際增加是10*sizeof(int)也就是40
而如果是p+2,由於p是char*,實際增加的是2*sizeof(char)=2
『伍』 C語言地址指針強制類型轉換
test是指向0x64000000沒錯。
但是test的作用域就不是一個位元組。
C語言的指針強大在於在當前進程的內存空間內可以任意操作內存。
也就是這個test可以訪問任意地址。不存在作用域只有一個位元組的說法。
所以,安全性只有代碼來保證。編譯器是不保證的
『陸』 C語言中指針強制轉換賦值
你這樣理解是有問題的,你應該知道&的優先順序是高於類型轉換的,所以是先取指針,然後再強制轉換為你需要的類型。例如第一句,Rcs9000_ram_port_flag必然是在前面定義為RCS9000_PORT_FLAG*類型,但後面的&g_Prot_flag[port_no]肯定在前面定義的並不是此類型,安全起見應該先將此指針轉換為RCS9000_PORT_FLAG*類型然後再賦值。假如&g_Prot_flag[port_no]為char類型,那麼指針加1的時候則移動一個位元組(即指向下一個8位數據),假如RCS9000_PORT_FLAG*類型為int類型(假設是32位系統,即int為32位),則強制轉換後按32位移動指針。
