void[1]:
void是C語言中的空類型,void的用途有二。
1、對函數(shù)返回的限定;
如果函數(shù)沒有返回值,則默認(rèn)返回整數(shù)類型,而不是void類型。c++有很嚴(yán)格的類型,不允許函數(shù)不加類型聲明,而編譯器則不這么認(rèn)為檢查這一點(diǎn)在VC6.0中可以驗(yàn)證。所以在編寫代碼的時(shí)候,每個(gè)函數(shù)都應(yīng)該加上返回類型。
2、對函數(shù)參數(shù)的限定;
在c++中,函數(shù)參數(shù)為void意味著不接受參數(shù),但是在c語言中可以給無參數(shù)的函數(shù)傳遞任意類型的參數(shù),這點(diǎn)在turbo c中可以驗(yàn)證。
指針的大小和機(jī)器的位數(shù)有關(guān),在32位機(jī)器上任何類型指針的大小都是4字節(jié),在64位機(jī)器上為8。所以指針大小和類型無關(guān)。
void*就是空類型指針,所謂空類型指針就是通用指針類型。它有以下特點(diǎn)。1、按照ASC碼標(biāo)準(zhǔn)void指針不能做算術(shù)操作,因?yàn)椴淮_定其指向數(shù)據(jù)類型大小;
2、c++允許將任何類型的指針賦給void*,但是不允許void指針賦值給其它類型。必須顯示的強(qiáng)制轉(zhuǎn)換。
其它類型指針相互之間是否也可以強(qiáng)制裝換?
強(qiáng)制轉(zhuǎn)換后編譯能通過,大部分情況下運(yùn)行也是沒有問題的,但是根據(jù)參考文獻(xiàn)[4]的說法是容易出問題的,因?yàn)槟承〤PU對某些數(shù)據(jù)類型有對其限制,這樣在做指針強(qiáng)制轉(zhuǎn)換的時(shí)候就容易出現(xiàn)問題。
其實(shí),其它類型指針之間的轉(zhuǎn)換完全可以通過使用void*類型來避免。
sizeof[2]:
前面說在同一臺機(jī)器上指針大小是固定的,通過sizeof測試int*,char*,bool*,double*都出結(jié)果都是4(32位機(jī)器測試)。
今天在程序中memset一個(gè)T*類型的指針,發(fā)現(xiàn)沒有初始化成功,原來在memset的第三個(gè)參數(shù)中填的是sizeof(T*類型的指針)。特此總結(jié)了一下sizeof的一些問題。
1、char* s="0123456789";
sizeof(s)=4,s是一個(gè)指針。
sizeof(*s)=1,*s是第一個(gè)元素。
strlen(s)=10,s是字符串首地址。
2、char s[]="0123456789";
sizeof(s)=11,s是字符串?dāng)?shù)組,包括'\0'。
sizeof(*s)=1,*s是第一個(gè)元素。
strlen(s)=10,s是字符串首地址。
3、char s[20]="0123456789";
sizeof(s)=20,s是在內(nèi)存中靜態(tài)分配的大小。
sizeof(*s)=1,*s是第一個(gè)元素。
strlen(s)=10,s是字符串首地址。
結(jié)構(gòu)體[3]:
結(jié)構(gòu)體在字節(jié)對齊的時(shí)候有三個(gè)原則,有了這三個(gè)原則就很容易的可以計(jì)算出任意一個(gè)結(jié)構(gòu)體的sizeof大小了。
1、結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型的成員大小所整除;
2、結(jié)構(gòu)體每個(gè)成員相對于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);
3、結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailing padding)。
參考文獻(xiàn):
[1]、http://blog.sina.com.cn/s/blog_625cce080100kip3.html
[2]、http://shansun123.iteye.com/blog/398601 [3]、http://blog.csdn.net/Linux_Gao/article/details/2612885
[4]、http://blog.csdn.net/Linux_Gao/article/details/2612885