c語言是一門弱型別程式語言,在不越界、並且可讀寫的情況下可以對一段存在記憶體空間的內容進
行任意形式的訪問及修改;
對系統保留的資料型別做轉換:
int
main()
輸出為:a
這種轉換為賦值轉換,僅僅是將乙個變數的值賦予另外乙個型別的變數而已。在c語言中,char\short\int\long\float都可以相互直接賦值,只是資料的完整性在不同型別之間做轉換可能引起資料丟失的情況,這裡就不一一說明;
同樣是對型別的轉換,這裡對記憶體空間的儲存內容做不同形式的訪問
#include
intmain()
;int
*a = b;
printf
("%#x\n"
,*a)
;return0;
}輸出結果為:0x1010000
結果不是想象中的:0x00000101是因為這是多數主機的儲存是小端儲存,
即低位存放於低位址段。如0x12345678,在記憶體中的儲存為78
5634
12。
#include
intmain()
輸出結果為:d,即0x44;
b在記憶體中的儲存為:0x44
0x43
0x42
0x41,將b的位址資訊賦予型別為char
*的a時,
賦予a的意義為,將這塊記憶體區域以儲存0x44為首位址,進行每位元組的訪問,
*a代表的是首個位元組內容,即為0x44對應的ascii字元;
自定義結構體與其他型別的轉換
#include
typedef
struct _testtest;
intmain()
;int
*a =
(int*)
&tt;
printf
("%#x\n"
,*a)
;return0;
}輸出結果為:0x44434241
#include
typedef
struct _testtest;
intmain()
;//int *a = &tt;
char
*a =
(char*)
&tt;
printf
("%s\n"
, a)
;return0;
}輸出結果為:abc
#include
typedef
struct _testtest;
typedef
struct _test1itest;
intmain()
; itest it =
(itest)tt;
return0;
}自定義的不同的結構體型別是無法直接轉換的,即使結構體成員的所有型別都一致;
要順利進行轉換的話可以通過以下方式進行轉換,將:
itest it =
(itest)tt;
替換為:
itest it =
*(itest *
)&tt;
轉換思路為既然無法對變數型別進行型別強轉,那就對變數儲存的記憶體空間的訪問方式進行改變;
*(itest *
)&tt中,首先對tt的記憶體空間做訪問格式的變動,即(itest *
)&tt;
因為it並非指標,需要賦予的是tt儲存空間內對應的內容,
因此使用*
(itest *
)&tt進行解引用訪問;
將乙個long int型的記憶體位址轉換為指標訪問
#include
typedef
struct _testtest;
intmain()
;long
int addr =
&tt;
char
*a =
(char
*)addr;
printf
("%s\n"
, a)
;return0;
}輸出結果為:abc
函式型別強制轉換
#include
#define a 10
typedef
struct _testtest;
typedef
struct _test1itest;
typedef
void
(*print)
(itest *);
void
func
( test *t , test *t1)
void
func1
( itest *it )
intmain()
; print p =
(print *
)&func;
func1
((itest *
)&tt );p
((itest *
)&tt)
;return0;
}輸出結果為:
a65660x556e70cd2260
這個實驗意義不大哈,只是說明即使是函式,依然能夠被強制轉換,
但是丟失的入參是個隨機值或者野指標。
c語言中各資料型別在記憶體中的儲存方式
基本的資料型別有 以32位pc為列。char 1位元組 int 4位元組 long 4位元組 short 2位元組 signed char 1位元組 unsigned char 1位元組 unsigned long 4位元組 unsigned short 2位元組 float 4位元組 double...
C 中資料型別與其他語言中的資料型別之間的對應關係
下表列出了 net framework 提供的一些值型別,簡要描述了每個型別,並指示 visual basic c 和 c 中的相應型別。表中還包括object和string類的項,這些項在許多語言中都有相應的關鍵字。類別 類名 說明 visual basic 資料型別 c 資料型別 c 資料型別 ...
C 中資料型別與其他語言中的資料型別之間的對應關係
昨天除錯了半天的乙個錯誤,是從bmp中把灰度值轉化為高度資訊,是從乙個c 的 往c 中去轉換,cpp 中用了乙個char 的指標來存放位圖資料。我在用c 的時候並沒有過多的考慮,也用了char 結果一直都出錯。搞了乙個小時也沒找到原因。後來查了一下發現居然是型別之間的對應關係有誤。發現這個的原因是湊...