C指針類型轉換問題


先看下面的代碼:

#include<stdio.h>

int main ()
{
int a;
char *x;
x = (char *) &a;
a = 512;
x[0] = 1;
x[1] = 2;
printf("%d\n",a);

return 0;
} // 針對x86的處理器來說,其結果為513

  


原因

程序首先聲明了一個int變量,在我的電腦中,此int占用4字節。然后聲明了一個x指針,同樣,在我的電腦中它占用8字節。然后將a的內存地址賦值給x指針,注意這里用到了類型轉換:x=(char *) &a。如果不使用類型轉換,x指向的int型的內存單元大小為4字節,如果使用了類型轉換,x指向的char型的內存單元大小為1字節。

 

變量a的值為512,用4個字節的普通二進制表示就是:

    00000000 00000000 00000010 00000000

由於x86 CPU的字節序為小端序(最低有效位在最高有效位的前面),所以前面的二進制以小端序的表示方式為:

    00000000 00000010 00000000 00000000

操作方式是:先獲取最右邊的8位數字,然后放到新行的左邊;然后獲取下一個8位數字,再放到新行的左邊,它緊挨着上一個8位數字。以此循環操作,直到數據讀取完畢。注意的是一個字節(8位)里的數字順序是不變的。

 

x[0]表示指向a內存區域的第一個字節,並設置為1,此時的a內存表示為:

    00000001 00000010 00000000 00000000

然后是x[1]設置為2,則a內存表示為:

    00000001 00000010 00000000 00000000

然后將a內存轉為普通二進制表示方式(方式為從右到左讀取):

    00000000 00000000 00000010 00000001

最后的結果為:

    513

 

最后修改時間:2018-01-26 19:55


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM