1. 1 char array1[100]; 2 char* array2; 二者都可以當指針用,使用時有何區別?
1中字符數組,存儲於棧區,sizeof(array1)為100,aray1代表首元素首地址,不可以被賦值,array1[0]這樣可以被賦值,數組大小確定,難以擴容
2中存儲於字符常量區,sizeof(array2)為4,array2可以被賦值,array2[0]不可以被賦值,空間大小可變
2. 32位中,long型和指針占4個字節,64位中占8個字節
3. strcat連續拼接字符串時,每次都要找到結尾,解決方案時給結尾做標記
4. const在C語言中為只讀變量,C++中為常量
5. 一般機器默認小端存儲,蘋果機器為大端存儲
6. char a[] = "Hello world";
sizeof(a) = 12 注:sizeof時算 \0 ,strlen時不算 \0
sizeof(*a) = 1 sizeof(&a) = 4
當字符數組以函數參數形式存在時,sizeof為4
7. printf函數執行時,計算順序是從後向前,輸出順序是從前向後,可以將printf函數中想成傳入的參數,存儲於棧區
8.
int a[] ={2,8,16,24}; char* p1 = a; char* p2 = &a[3]; p2-p1 = ?
本題中,兩個地址相減,求的是指針的偏移量,p1指向的內容是2,p2指向的內容是24,p2-p1為3個4字節大小,為12,又因為p1和p2的基本類型為1個字節,所以(3*4)/1=12
9. 括號表示表達式,表達式要變成int類型計算;有符號要向無符號類型轉換;小類型要向大類型轉換
10.
(a=1)?2:3
a=1,表示整個表達式的值為1,所以輸出為2
11.switch case語句中,每個case過後如若沒有遇到break,則順次向下執行
12.char a[100] = {'a','b','c','\0','1','2'}; 遇到 '\0' 字符串結束
char a[100] = {'a','b','c','0','1','2'}; '0' 代表字符不是'\0'
char a[100] = {'a','b','c',0,'1','2'}; '\0'就是0,字符串結束
13.阿克曼函數 ack(1,k) = 2+x; ack(2,x) = 3+2*x; ack(3,x) = 2^(x+3)-3;
14.在移位運算時,數據需要補位時,符號位是什麼就補什麼
如
int i = 0xf0000000;i >>=1; i=0xf8000000
15.常量數值不能進行自加自減運算
16.注意與或運算,與運算時,前面表達式為假時,與運算符後面的表達式不參與運算,輸出為假,若為真,則再計算與運算符後面的表達式
或運算時,或運算符前面的表達式為真時,不計算或運算符後面的表達式,直接輸出為1,若為假,則在計算或運算符後面的表達式
17.sizeof返回值為unsigned int,當int遇到了unsigned int 時,轉換為unsigned int進行計算
18.棧區空間的生命周期在遇到}時截止,在}之前返回棧區申請的空間不存在,因為被回收了,字符常量區的內容只能讀不能向裡面寫