void[1]:
void是C語言中的空類型,void的用途有二。
1、對函數返回的限定;
如果函數沒有返回值,則默認返回整數類型,而不是void類型。c++有很嚴格的類型,不允許函數不加類型聲明,而編譯器則不這么認為檢查這一點在VC6.0中可以驗證。所以在編寫代碼的時候,每個函數都應該加上返回類型。
2、對函數參數的限定;
在c++中,函數參數為void意味著不接受參數,但是在c語言中可以給無參數的函數傳遞任意類型的參數,這點在turbo c中可以驗證。
指針的大小和機器的位數有關,在32位機器上任何類型指針的大小都是4字節,在64位機器上為8。所以指針大小和類型無關。
void*就是空類型指針,所謂空類型指針就是通用指針類型。它有以下特點。1、按照ASC碼標準void指針不能做算術操作,因為不確定其指向數據類型大小;
2、c++允許將任何類型的指針賦給void*,但是不允許void指針賦值給其它類型。必須顯示的強制轉換。
其它類型指針相互之間是否也可以強制裝換?
強制轉換后編譯能通過,大部分情況下運行也是沒有問題的,但是根據參考文獻[4]的說法是容易出問題的,因為某些CPU對某些數據類型有對其限制,這樣在做指針強制轉換的時候就容易出現問題。
其實,其它類型指針之間的轉換完全可以通過使用void*類型來避免。
sizeof[2]:
前面說在同一臺機器上指針大小是固定的,通過sizeof測試int*,char*,bool*,double*都出結果都是4(32位機器測試)。
今天在程序中memset一個T*類型的指針,發現沒有初始化成功,原來在memset的第三個參數中填的是sizeof(T*類型的指針)。特此總結了一下sizeof的一些問題。
1、char* s="0123456789";
sizeof(s)=4,s是一個指針。
sizeof(*s)=1,*s是第一個元素。
strlen(s)=10,s是字符串首地址。
2、char s[]="0123456789";
sizeof(s)=11,s是字符串數組,包括'\0'。
sizeof(*s)=1,*s是第一個元素。
strlen(s)=10,s是字符串首地址。
3、char s[20]="0123456789";
sizeof(s)=20,s是在內存中靜態分配的大小。
sizeof(*s)=1,*s是第一個元素。
strlen(s)=10,s是字符串首地址。
結構體[3]:
結構體在字節對齊的時候有三個原則,有了這三個原則就很容易的可以計算出任意一個結構體的sizeof大小了。
1、結構體變量的首地址能夠被其最寬基本類型的成員大小所整除;
2、結構體每個成員相對于結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充字節(internal adding);
3、結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之后加上填充字節(trailing padding)。
參考文獻:
[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