寫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...