《你必须知道的495个C语言问题》笔记
4.3 *p++自增p还是p所指向的变量?
a:++优先级高于(星号),p++和(p++)等价,他自增p并返回p自增前所指向的值。
4.4 C语言中的指针算术总是自动地采纳它所指向的对象的大小,所以访问的时候不需要使用+sizeof(类型)的方法。
4.5 我有一个char*型指针碰巧指向一些int型变量,我想跳过他们,为什么((int *)p)++;这样的代码不行?
a:显然作为一个右值,当然不行,因为赋给左值的是自增之前的值,可用:
p=(char *)((int *)p+1);
注:转成int *型以后,加1,还需要转成int *。
4.8 C语言中,函数是通过值传递的,当需要传入指针的地址时,用双重指针。
4.9 函数extern int f(int *);,它接受指向int型指针。,怎样传入一个常量?调用f(&5)似乎不行。
a:C99中,用复合字面量:
f((int[ ]){5});
C99之前必须先定义一个临时变量,然后把他的地址传给函数。
注:复合字面量,一种语法,如:int a[1] = {5},就相当于(int [1]){5} (数组大小可以省略)。
4.11 C语言可以“按引用传参”吗?
a:没有。当向函数传入数组时,编译器本质上在模拟按引用传参,但不是真正的按引用传参。
4.12 函数总是通过指针调用的,所有“真正的”函数名在表达式和初始化中,总是隐式地退化为指针。
本文深入探讨了C语言中指针操作的细节,包括*p++的自增行为,指针算术的自动调整特性,以及如何正确跳过不同类型的数据。同时,解析了函数参数传递的方式,包括值传递、双重指针的使用,以及如何通过复合字面量或临时变量向函数传入常量。最后,澄清了C语言中不存在真正的按引用传参,并解释了函数名在调用时的隐式转换行为。

被折叠的 条评论
为什么被折叠?



