在分析之前,我們先熟悉下在16位、32位、64位下指標型別 與char型別所佔空間
16位 32位 64位
char 1 1 1
指標 2 4 8(我們在有的編譯環境下面sizeof出來是4 是因為編譯器為了編譯32位機器**而做的妥協,按道理上是8位)
ok,讓我們開始測試並分析如下各種情況
如下假設我們的程式(64位機器)如下:
void countsize(char a)
int main()
siezeof(a)==6, sizeof(b)==4, sizeof( *b)==1, sizeof(c)=10
因為a的結尾還有乙個字串結束符』\0』所以一共有6個位元組
同時 b是乙個指標 無論如何都是4, 但是*可以理解為乙個位址型別,b才存放著另外乙個變數的位址所以輸出為1
,c已經指定了大小 則輸出為10.
特別有意思的是 countsiz(a)==4 countsize(b)==4 countsize(c)==4 其實coutsize(char a)與coutsize(char *a)是一樣的,它是不會為你記錄陣列的大小,而是傳入了位址引數。
關於字元陣列的長度問題(sizeof與strlen)
strlen
strlen函式遇到'\0'結束統計並返回。
char chs0[7] = ; // 長度為6, 在末尾自動加上了'\0'
char chs1[7] = ; // 長度為6
char chs2 = ; // 長度為6
char chs3 = ; // 長度未知,因為陣列最後沒有結束符'/0'
char chs4[6] = // 長度未知,因為陣列最後沒有結束符'/0'
char c=;
可寫為:
char c=;
或去掉{}寫為:
char c=」c program」;
用字串方式賦值比用字元逐個賦值要多佔乙個位元組, 用於存放字串結束標誌』/0』。
sizeof
sizeof就是計算所佔位元組長度
如果有錯誤歡迎指正 感謝 比心 char a 與char a 的區別
char a hello 中的a是指向第乙個字元 a 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...
char a 與char a 的區別
char a hello 中的a是指向第乙個字元 h 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...
char a 與char a 的區別
char a hello 中的a是指向第乙個字元 a 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...