【原創】C語言和C++常見誤區(一)
本文僅在部落格園發布,認準原文地址://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表示指針自身不可變,指向的字元可變。
而最後一個,指向的字元和指針自身都不可變。
本期內容到此為止。