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.所有静态存储区或全局存储区的变量若无显式赋值,则系统自动赋值为零。