關於指標型別轉換的乙個有趣實驗

2021-07-04 18:57:53 字數 1393 閱讀 2209

前段時間碰到這麼乙個有趣的題目:

int a = 0x1234abcd;

char* b = (char*)(&a);

printf("%d\n", *b);

請問輸出的內容是什麼?

題目大概的意思是,int型別的指標轉換為char型別的指標後,會讀取原來哪些內容。int型別是4個位元組,char型別是1個位元組,肯定只能讀取一部分內容,所以只要找到這讀取的部分內容,輸出的值自然就明白了。

首先,為了簡化難度,我們用乙個簡單的方便表示成二進位制的數字:int a = 0x80808081;對應的二進位制就是:10000000    10000000    10000000    10000001。把a轉換成char型別指標後,讀取指標內容,很明顯只能讀取乙個位元組。指標肯定是從int首位址開始讀取的,那麼讀取的是哪個位元組呢?10000000還是10000001呢?做個試驗就知道了。**如下:

#include "stdafx.h"

int _tmain(int argc, _tchar* argv)

輸出的結果是:

-127的補碼是:10000001(只取8位),所以char指標讀取的是a的低位數值。同時我們也知道了,在vs 2013的環境下(我是在vs 2013中做的實驗),高位儲存在高位址,低位儲存在低位址中。

好,同樣的道理,我們來看看當a=0x1234abcd時,輸出是多少。

首先將其表示為二進位制得:10010001101001010101111001101

然後我們取低8位得:11001101

最後將補碼轉換為十進位制得:-51

看看程式執行結果是多少,**如下:

#include "stdafx.h"

int _tmain(int argc, _tchar* argv)

輸出的結果是:

與我們的分析的結果剛好一致。

這裡我們是將int*轉換成了char*型別,讀取的內容是擷取了的。那麼如果將char*型別轉換為int*型別呢?因為int*會讀取4個位元組,所以應該是隨機的值。實驗**和結果分別如下:

#include "stdafx.h"

int _tmain(int argc, _tchar* argv)

執行結果:

執行結果應該是因人而異就對了。

希望這個有趣的試驗可以幫助你更好的理解指標。^_^

乙個有趣的實驗

import numpy as np list1 初始時每個賬戶都有1塊錢 for i in range 100 輪轉開始,對於每個賬戶,可以任選1個賬戶,並從自己的資金中分配乙個隨機數額給他 for t in range 1000 輪轉1000次 for i in range 100 對於賬戶i,...

乙個有趣的指標問題

是從網上看到的乙個例子 struct s int i int p void main struct s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 問程式會在哪一行死掉 解答 程式執行到最後一行就會報出異常,死掉.具體解答為 首先需要說明的是結構體s,...

關於智慧型指標的乙個有趣的筆記

這幾天比較好奇就是c 的智慧型指標在離開作用域之後是否會被銷毀,疑惑點來自自己寫的一段小 int count 0 vector observers typedef std vector iterator iterator while 1 shared ptrp new foo weak ptrw p...