今天看了一本C陷阱与指针的书,从中挑选了一些我自己平常不太注意的地方,或者有些是记不太清的东西,稍微整理了下有以下这些地方:
1:=与==是不同的,一个是赋值,一个是比较
2:&与&&是不同的,前者是按位与,后者是逻辑与,理解2&1和2&&1的结果
3:整形常量第一个字符是0,则代表8进制,0195这个理解成141(十进制),0215(八进制)。
4:‘’中的字符代表一个整数,“”代表指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符‘\0’初始化。
5:a+++++b的含义(a++)+(++b)若根据贪心法,((a++)++)+b,但语法上a++不能做左值。
6:float g():()优先级大于,则g()函数返回一个浮点型指针;
7:(*fp)():*fp是该指针指向的函数,(*fp)()是调用该函数的方法;void(*fp)():代表fp是一个返回值为void类型的函数的指针;
8:((void()())0)():里面(void(*)())0将常数0转换成指向返回值为void的函数的指针类型,整式就是调用首地址为0位置的子函数。
9:算术运算符>移位运算符>关系运算符>逻辑运算符。赋值运算符<条件运算符。
10:声明的后面要有分号,包括结构体,类定义;
11:当数组作为参数时,实际上是数组的第一个元素作为了参数。
12:编译器保证由0转换而来的指针不等于任何有效的指针,决不能使用该指针所指向的内存中存储的内容。
13:有符号整型相加可能会溢出,稳妥的是转换成无符号数。
14:static修饰符把变量的作用域限制在一个源文件中,对其他源文件不可见。
15:fread()和fwrite()之间要有fseek才可以进行交叉读写。
16:FILE和LINE是内建于C语言处理器中的宏,它们会被扩展为所在文件的文件名和所在代码行的行号。
17:assert的参数是一个表达式,若表达式为0,就使程序终止执行,并给出一条适当的出错信息。
18:#define FOOTYPE struct foo和typedef struct foo FOOTYPE是一样的,但后者更通用。
19:char型转换成unsigned int时要先转化成int型,这可能不对;unsigned char 转换成uint是可以直接转化的。
20:移位运算比除法运算快很多。
21:NULL指针并不指向任何对象,除非用于赋值或比较运算,其余都是非法的。在内存位置0处加了硬件级的读保护,对内存位置0只允许读,不允许写。
22:RAND_MAX等于随机数的最大取值。
23:malloc(n)将返回一个指针,指向一块新分配的可以容纳n个字符的内存,编程者可以使用这块内存;
把malloc函数返回的指针作为参数传入free函数这样就可以重新利用;
调用realloc函数时,需要把指向一块已分配内存的区域指针以及这块内存新的大小作为参数传入,就可以调整这块内存区域新的大小,会涉及内存的拷贝。
24: printf函数把格式说明字符串中的字符逐一复制到标准输出,直到格式字符串结束或者遇到一个%字符;
fprintf函数则可以把数据写到任何文件中;
sprintf函数是把输出数据写到第一个参数指向的字符数组中。
%u和%d一样,u是无符号数;
%o,x,X打印8进制,16进制小写,16进制大写;
%s打印字符串,%c打印单个字符串;
%g,%f,%e打印浮点数值。g打印不需要按列对齐的浮点数,e是指数形式,f不用指数形式;
C语言需要注意的地方
最新推荐文章于 2022-01-13 16:25:08 发布