在學(xué)習(xí)C語言的過程中,我們不免會遇到很多陷阱,我把這些常見的陷阱總結(jié)起來,就是為了避免以后犯同樣的錯誤。
1.1char array1[100]; 2 char* array2;二者都可以當(dāng)指針用,使用時有何區(qū)別?
1中字符數(shù)組,存儲于棧區(qū),sizeof(array1)為100,aray1代表首元素首地址,不可以被賦值,array1[0]這樣可以被賦值,數(shù)組大小確定,難以擴(kuò)容
2中存儲于字符常量區(qū),sizeof(array2)為4,array2可以被賦值,array2[0]不可以被賦值,空間大小可變
2. 32位中,long型和指針占4個字節(jié),64位中占8個字節(jié)
3.strcat連續(xù)拼接字符串時,每次都要找到結(jié)尾,解決方案時給結(jié)尾做標(biāo)記
4.const在C語言中為只讀變量,C++中為常量
5.一般機(jī)器默認(rèn)小端存儲,蘋果機(jī)器為大端存儲
6. char a[] = "Hello world";
sizeof(a) = 12注:sizeof時算\0,strlen時不算\0
sizeof(*a) = 1 sizeof(&a) = 4
當(dāng)字符數(shù)組以函數(shù)參數(shù)形式存在時,sizeof為4
7.printf函數(shù)執(zhí)行時,計算順序是從后向前,輸出順序是從前向后,可以將printf函數(shù)中想成傳入的參數(shù),存儲于棧區(qū)
8.
int a[] ={2,8,16,24};char* p1 = a;char* p2 = &a[3];
p2-p1 = ?
本題中,兩個地址相減,求的是指針的偏移量,p1指向的內(nèi)容是2,p2指向的內(nèi)容是24,p2-p1為3個4字節(jié)大小,為12,又因為p1和p2的基本類型為1個字節(jié),所以(3*4)/1=12
9.括號表示表達(dá)式,表達(dá)式要變成int類型計算;有符號要向無符號類型轉(zhuǎn)換;小類型要向大類型轉(zhuǎn)換
10.
(a=1)?2:3
a=1,表示整個表達(dá)式的值為1,所以輸出為2
11.switch case語句中,每個case過后如若沒有遇到break,則順次向下執(zhí)行
12.char a[100] = {'a','b','c','\0','1','2'};遇到'\0'字符串結(jié)束
char a[100] = {'a','b','c','0','1','2'}; '0'代表字符不是'\0'
char a[100] = {'a','b','c',0,'1','2'}; '\0'就是0,字符串結(jié)束
13.阿克曼函數(shù)ack(1,k) = 2+x; ack(2,x) = 3+2*x; ack(3,x) = 2^(x+3)-3;
14.在移位運算時,數(shù)據(jù)需要補(bǔ)位時,符號位是什么就補(bǔ)什么
如
int i = 0xf0000000;i >>=1; i=0xf8000000
15.常量數(shù)值不能進(jìn)行自加自減運算
16.注意與或運算,與運算時,前面表達(dá)式為假時,與運算符后面的表達(dá)式不參與運算,輸出為假,若為真,則再計算與運算符后面的表達(dá)式
或運算時,或運算符前面的表達(dá)式為真時,不計算或運算符后面的表達(dá)式,直接輸出為1,若為假,則在計算或運算符后面的表達(dá)式
17.sizeof返回值為unsigned int,當(dāng)int遇到了unsigned int時,轉(zhuǎn)換為unsigned int進(jìn)行計算
18.棧區(qū)空間的生命周期在遇到}時截止,在}之前返回棧區(qū)申請的空間不存在,因為被回收了,字符常量區(qū)的內(nèi)容只能讀不能向里面寫
原文來自:博客園/zs0909zs