前段時間碰到這麼乙個有趣的題目:
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...