【原創】C語言和C++常見誤區(一)


本文僅在博客園發布,認准原文地址:https://www.cnblogs.com/jisuanjizhishizatan/p/15414469.html


問題1:int類型占幾個字節?

常見誤區:占4個字節。
實際上,C語言標准並未規定int類型所占的字節數。因此,在不同的機型上,所輸出的結果可能不同。部分較老版本的C編譯器,可能int類型是2字節。

問題1-1:char類型占幾個字節?

答案是1個字節。C標准規定了sizeof(char)的結果必定為1,不受處理環境影響。


問題2:下面的代碼有何錯誤?

char s1[10];
//省略的很多操作
if(s1=="123456789")...

很多初學者都會這樣寫。這樣寫在語法上沒有錯誤,但是在運行結果上卻總會返回錯誤結果。
s1是一個C風格字符串,也就是char類型的數組(或指針),而"123456789"卻是字符串常量。把它們使用==運算符進行比較,比較的不是字符串的內容,而是在比較指針。在表達式中,數組如果后面不帶[],就會被解釋作指針。

如果需要比較C風格字符串,需要使用strcmp函數來比較,這個函數包含在string.h中。因此,上述代碼應該改寫為這樣:

char s1[10];
//省略的很多操作
if(strcmp(s1,"123456789")==0)...

問題3:下面的代碼會正常運行嗎?

int a[10],b[10];
for(int i=0;i<n;i++){
  ...
  b=a;
}

在代碼編寫過程中,我們經常會使用“拷貝數組”這一行為,例如動態規划中的滾動數組。
然而,上面的代碼是無法正常運行的。實際上,數組名b,實際上是&b[0],也就是說,b是一個常量,是不可修改的。因此,數組名在表達式中只能作為右值出現。
而指針,其實是可以修改的。但是對於兩個指針a和b,執行b=a后,實際上,結果是下面這樣:

也就是說,a和b指向同一數組,這顯然不是我們想要的。如果要拷貝數組,我們需要使用memcpy函數,同樣包含在string.h中。因此,我們應該這樣寫:

memcpy(b,a,sizeof(a));

這樣就可以拷貝數組了。


問題4:const的一些疑問
關於const和指針連在一起,經常讓初學者們摸不着頭腦。
例如下面幾句:

const char *p
char const *p
char* const p
const char* const p

它們各有什么區別?
我這里曾經從《征服C指針》看到了幾條非常好的內容,在此給大家分享一下:

因為C語言是美國人發明的,最好還是用英語來讀(聲明語句)。
規則:從后往前倒序,如果遇到*號,就加上“pointer to”,如果有const,就追加“read-only”。
const在前面和在后面完全相同。

例如,對const char *p進行翻譯:
首先看到p:p is
然后是*:p is pointer to
然后是char:p is pointer to char
然后是const:p is pointer to read-only char
翻譯為中文:p是指向只讀的char的指針

按照這種方式解釋,我們對上面四個語句解釋如下:

p is pointer to read-only char
p is pointer to read-only char
p is read-only pointer to char
p is read-only pointer to read-only char

照這樣,我們得出結論:
const char* p 和char const* p含義完全相同,表示指向的字符是不可變的。
char* const p表示指針自身不可變,指向的字符可變。
而最后一個,指向的字符和指針自身都不可變。

本期內容到此為止。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM