C 不同型別指標的相互轉化

2021-06-25 23:50:20 字數 1392 閱讀 1106

寫c已經有一段時間了,今天聽到有人說c的不同指標型別不能相互轉化!我不相信,但畢竟對方資歷比我深,慎重起見,只是笑過。

但一直想著這個問題,於是剛才寫了乙個簡單的demo,測試了c指標的效能!年輕就是要敢於質疑!

我還記得之前看過windows程式設計時,很多函式使用了類似 以下的寫法,所以才確信自己的想法!    

void* p;

p=(void*)fs; // file* fs;

我對c指標的理解是:指標只是乙個記憶體塊,記憶體塊存的值就是位址,可以只是乙個byte,也可以是多個byte連成的記憶體塊的首位址。c的結構體就是一記憶體塊,結構體指標即是指向此記憶體塊的首位址,而指標的型別,用來表示這個記憶體塊的解析規則,如第乙個域是char,第二個域是int,則呼叫struct_name->char_domain時,是首位址,而呼叫的是int域時,即是首位址+4(不是加1,有位元組對齊的情況)。那麼用任意的解析規則也是可以的!就是怕崩掉!編譯器會阻止。不過不排除有誰能騙過編譯器的情況啊!

此程式在win7 作業系統上測試通過,使用mingw gcc 3.4.0編譯器。

#include #include #include struct __mem;

struct _mem_x;

// 定義記憶體中的乙個位元組記憶體單元

typedef unsigned char _byte;

// 定義了一次訪問4字的解析規則

typedef long _ptr;

intmain(int argc,char** argv)

// 指標型別轉化

在我的機器上顯示的結果如上:

1行)6893520     記憶體塊m的首位址;

2行)6893520     記憶體塊m的首位址,6885104   記憶體當前的值(未使用memset());

3-10行)6893520 - 6893527 是記憶體塊的位址序列, 後接的值即是當前記憶體單元(以byte方式訪問)  的值。

11行)6893520   即是使用_mem_x結構體的指標訪問第乙個域int的位址,也是此記憶體塊的首位址,6893520   記憶體單元首位址。

12行) 6893524    使用_mem_x結構體指標訪問域char的位址,即是記憶體塊首位址+4(注,此處不能使用mx+4得到char域的位址,因為+4的意思是+4*sizeof(_mem_x))。

型別相互轉化

1.short int exp short shortvar 0 int intvar 0 shortvar short intvar 2.int short exp short shortvar 0 int intvar 0 intvar shortvar 3.int string exp int...

VC中型別的相互轉化

總是覺得 vc中的型別紛繁複雜,撲朔迷離。因為有了 unicode 因為c c 型別相互轉化如此不同。儲存 char 的不止char 一種,還可以用 short unsigned short int 等來儲存。單單就字串就有 n多種型別,其它型別也不止乙個。再加上 c 中本來就沒有正式的 strin...

js 型別之間的相互轉化

設定元素物件屬性 var img document.queryselector img img.setattribute src 值型別number string undefined boolen 引入型別 function a function object a a.age null a null...