2023年2月26日
类型声明
#
char** args;
char **ap, *args[max];
ap = args;
char *args[max];
args是个数组, 数组有max个元素, 元素类型是指针类型, 指向char类型元素
类型隐式转换
#
- 有符号数与无符号数运算, 有符号数会转换为无符号数
c语言关键字多重含义
#
Symbol |
Meaning |
static |
1. Inside a function, retains its value between calls 2. At the function level, visible only in this file |
extern |
1. Applied to a function definition, has global scope (and is redundant) 2. Applied to a variable, defined elsewhere |
void |
1. As the return type of a function, doesn’t return a value 2. In a pointer declaration, the type of a generic pointer 3. In a parameter list, takes no parameters |
* |
1. The multiplication operator 2. Applied to a pointer, indirection 3. In a declaration, a pointer |
& |
1. Bitwise AND operator 2. Address-of operator |
= == |
1.Assignment operator 2. Comparison operator |
<= «= |
1. Less-than-or-equal-to operator 2. Compound shift-left assignment operator |
< < |
1. Less-than operator 2. Left delimiter in #include directive |
() |
1. Enclose formal parameters in a function definition 2. Make a function call 3. Provide expression precedence 4. Convert (cast) a value to a different type 5. Define a macro with arguments 6.Make a macro call with arguments 7.Enclose the operand of the sizeof operator when it is a typename |
优先级
#
Precedence problem |
Expression |
What People Expect |
What They Actually Get |
.的优先级高于*->操作符用于消除这个问题 |
*p.f |
p所指向对象的字段f (*p.f) |
对p取f偏移, 作为指针, 然后进行解除引用操作 *(p.f) |
[]高于* |
int *ap[] |
ap是个指向int数组的指针 int(*ap)[] |
ap是个元素为int指针的数组 int *(ap[]) |
函数()高于* |
int *fp() |
fp是个函数指针, 所指函数返回int 即:int(*fp)() |
fp是个函数, 返回 int* 即:int *(fp()) |
==和!=高于位操作运算符 |
(val & mask != 0) |
(val & mask) != 0 |
val & (mask != 0) |
==和!=高于赋值符 |
c=getchar() != EOF |
(c=getchar()) != EOF |
c = (getchar() != EOF) |
算数运算符高于位运算符 |
msb « 4 + lsb |
(msb « )4 + lsb |
msb « (4 + lsb) |
逗号运算符在所有运算符中优先级最低 |
i=1, 2 |
i=(1, 2) |
(i=1), 2 其中2被丢弃 |
指针的思考
#
- 指针通常不知道有多长,所以函数一般还需要传递一个长度参数
- 字符数组和字符串的主要不同是有没有\0的区别
- 想要创建什么类型的数组,那就是创建什么类型的指针
- 指向指针的指针: 即指向指针数组的指针
优先级思考
#
- *p++ = 1 先赋值,后++
求值顺序
#
- c语言只有4个运算符(&&、||、?: 和 ,)规定的运算顺序
- 注意: f(x, y) 中 x, y的求值顺序是未知的
内存布局
#
int i, a[10]
在内存由高位向地位分配时, i在高位, a[0]在最低位, 内存连续分配的, a[10]与i的地址相同, 具体内存分配由编译器实现不同而不同
为什么 &sizeof 不合法
#
- 因为 & 和 sizeof 都是运算符