C语言复习tips(三)
以下知识点是我在学习C语言课程的过程中零零散散地记录下来的,分三次呈现出来,认为有用的小伙伴可以先收藏哦??有问题请在评论区指出。蟹蟹~~😄😄
43)宏定义分为普通宏定义和带参数的宏定义
??????//普通宏
??????#define Pi (3.1415926)
??????//带参数的宏 (宏函数)
??????#define max(a,b) ((a)>(b)? (a),(b))
??????注意变量在宏中要用括号括起来,因为,在C语言中define宏定义在编译时,会被展开,进行“傻瓜式”替换,也称为“字面”替换,如果没有括号有可能会产生歧义。如:
??????int a,b,c,d,e;
??????a=1;b=2;c=3,d=4;
??????e=f(a+b)* f(c+d) ; //理论值e=9*100=9001.
??????1>#define f(x)(x*x)
??????替换结果为:e=(a+ba+b)(c+dc+d) = 519=95
??????2> #define f(x) x*x
??????替换结果为:e=a+ba+bc+d*c+d=1+2+6+12+4=43
??????3>#define f(x) ( (x)*(x) )
??????替换结果为:e=( (a+b)(a+b)(c+d)(c+d) )=3377=441
44)一般情况下是对结构体变量中的各个成员进行赋值或存取以及运算,但如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,再进行操作。
45)结构体类型中的成员名可以与程序中的变量名相同并且二者并不代表同一对象。但是用结构体定义的变量名不可以与程序中的变量名相同。
46)数组元素可以作函数实参,不能作形参。因为C语言编译器并不检查形参数组的大小,只是将实参数组首元素的地址传给形参数组名。
47)在函数调用时,数组名或指针变量作函数参数的调用称为传地址调用;普通变量作函数参数的调用称为传值调用。
48)通过指针引用二维数组,就涉及到行指针int(p)[N]与列指针intp,应注意列指针是不允许像行指针那样以二维形式表示的。列指针指向二维数组的元素是需要算相对位移量的。
49)定义指向函数的指针变量p,将函数入口地址赋给p后,在函数指针变量调用函数时,只须将(*p)代替函数名,再在(*p)之后的括号中根据需要写上实参即可。
50)指针变量是用来存放地址的,一个任何类型的指针变量所占的字节大小一般为4个字节。
51)void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可由编译系统自动进行隐式转换。无论用那种转换,首先必须了解要进行类型转换。
52)如果p指向一个结构体变量stu,以下3种访问成员的用法等价:
??????1> stu. 成员名(如stu.num);
??????2> (*p).成员名(如(*p).num);
??????3> p->成员名(如p->nun);
53)C语言的编译器以压栈式存储的,所以输出时是从栈顶往栈底读取数据的,但我们看到在用printf输出时,是从右往左进行的。(有的编译器有些例外)
54)在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外。sizeof返回整个数组所用的字节而不是一个指针所占用的字节;单目操作符&返回一个数组的指针而不是一个指向数组第一个元素的指针的指针。
55)字符串的列表可以以矩阵的形式存储,也可以以指向字符串常量的指针数组形式存储。在矩阵中,每行必须与最长字符串的长度一样长,但它不需要任何指针。指针数组本身要占用空间,但是每个指针所指向的字符串所占用的内存空间就是字符串本身的长度。
56)malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。另一个较小的区别是它们请求内存数量的方式不同。
57)realloc用于修改一个已经分配的内存块的大小,即将一块扩大或缩小。缩小时尾部内存被丢弃;扩大时原先内容依然保留。如果原先的内存块无法扩大,realloc函数将分配另一块正确大小的内存,并将原先那块内存的内容复制到新的块上 。因此,在使用realloc之后,你就不能再使用指向旧内存的指针,而应改用realloc所返回的新指针。
58)realloc之后,你就不能再使用指向旧内存的指针,而应改用realloc所返回的新指针。
59)
|