类型是内存中空间大小的别名;
变量是内存中一段连续空间的别名;
auto使用栈空间,局部变量;
register使用cpu寄存器,不一定分配成功,局部变量;
static使用静态区,static可以是局部的也可以本文件全局的。static作用于函数可以限制该函数只在本文件中有效。
if语句
如果是布尔类型,if条件不需要比较,直接使用。
如果与常量进行相等比较,将常量放在==左边,好处是如果由于疏忽少了一个=编译器会报错,否则这个错误很难发现。
float类型相等比较一般采用精度范围比较,这是由于float设计上就不是很精确。
do{}while(0)很有用,如下图所示。这样可以避免多个返回,是的程序调理,可读性强、易于维护。
c语言函数中资源的分配一般都位于函数开始处,资源的回收位于函数的结尾处,易于维护,防止内存泄漏。
goto弃用
没有void变量,有void指针变量,void指针变量可以接受任意类型的指针变量,反过来需要强制转换。
extern “C” {}括号内按照标准c编译。gcc编译这段会报错,g++可以正常编译通过。
sizeof不是函数,其在编译阶段已经处理好,不是在运行时处理的,加括号只是习惯做法,对于变量可以不加括号,但是对于类型需要加。
const
const只在编译时有效,运行时无效。可以通过指针改变const类型的变量。const修饰的数组是不可被改变的,现代编译器编译后如果出现这种问题会crash。
const修饰指针,const出现在*左边,指针指向的数据不可变,const出现在*右边,指针本身不可变。即左数右指。
const修饰函数参数,表示函数体内不能改变参数的值。
const修饰函数返回值,表示返回值不能被修改。多用于返回指针的情况。
volatile
可理解为编译器警告指示字,告诉编译器必须去内存取变量,而不要作优化。主要用于修饰被多进程线程访问的变量。在嵌入式中中断可能会改变一个变量的值,这个变量必须用volatile修饰。
结构体
空结构体大小不同编译器结果不同,有0也有1,1比较合理。
可以用结构体定义柔性数组。结构体中数组没有大小,只占位不分配空间。之后可以使用malloc分配空间。
c语言union分配最大数据类型的空间,受系统大小端影响,可以利用这个特性判断系统的大小端。
方法:在union中定义一个int和char,给int赋值(小于255),判断char是不是也是这个值。
enum
真正的常量,在前一个值上加一,有类型可调试。定义常量尽量用enum。
typedef
给已存在的类型起别名。注意与define区别。
网友评论