1.函數形參求值順序:
int i = 2;
max(i, i++);
a.若順序從左到右則為max(2, 2);
b.若順序從右到左則為max(3, 2);
要寫與求值順序無關的函數。
2.函數值傳遞特點:
a.形參與實參占有不同的內存單元;
b.單向傳遞。
3.extern可以擴展函數的作用域,不管是在同一文件中還是在不同文件中。
4.const的用法:
a.修飾函數參數,表明此參數不可更改
b.修飾普通變量,表明此變量不可更改
c.修飾指針變量,(分兩種)
example:
(1)const int *p = &a; 等同於 int const *p = &a;
代表指針p所指向的值不能被修改。
(2)int* const p = &a;
代表指針p不能被修改。
區分方法:看"const"在"*"前面還是後面。
5.static的用法:
a.限定變量的作用域
b.設置變量的存儲域
6.用聯合體判斷CPU是大端還是小端:
int is_endian()
{
union A{
int a;
char b;
}B;
B.a = 0x01;
printf("%d\n",B.b);
}
7.數組和指針:
a.分析char *a;
(1)char * : 去掉了a, 變量的類型(指針)。
(2)char : 去掉了*a, 指針所指向的類型。
b.int *p1[10] (指針數組)
int (*p2)[10] (數組指針,指向一個數組,每個數組元素都是int類型)。
c.char a[5];
(1)char (*p1)[5] = &a;(正確)
(2)char (*p2)[5] = a; (錯誤)
(3)char *p = a; (正確)
這裡a代表數組首元素的地址,即&a[0]。分清數組首元素地址和數組地址的分別。
d.如果出現指針不兼容警告,那麼指針的類型應該跟隨左操作數。
8.變量的作用域:
a.C編譯器進行了優化:變量在沒有使用之前是不分配內存的。比如兩個文件中同時定義了全局變量int a;因為它們沒有分配內存,所以在使用時不會出錯。如果同時定義了int a = 1; int a = 2;那就錯了。最好在全局變量前加上static。
b.塊變量:某個語句塊運行時存在。
c.靜態局部變量具有全局生存期,但他的作用域還是函數作用域。
d.所有靜態存儲區或全局存儲區的變量若無顯式賦值,則系統自動賦值為零。