goto
goto绝对禁止使用
void
如果函数没有返回值,应该将其声明为void,如果函数没有参数,应该将其声明为void,void不能定义变量和数组,但能够定义指针。
void指针的意义:void指针作为左值时用于“接受”任意类型的指针,void*指针作为右值使用时需要强制类型转换。
void*指针接受一个其他类型的指针后自身的类型不会转变。
const
const定义一个只读变量。
const不能出现在赋值符号的左边,但可以在定义的时候初始化。
const只在编译期有用,在运行期无用(我们可以在运行期修改const的值,比如说利用指针指向一个const修饰的变量,然后给指针赋值)。
在标准C语言编译期中,const修饰的局部变量在栈上分配空间,const修饰的全局变量在全局数据区分配空间,均只是加上只读属性,值不可改变。
在现代C语言编译器中, const修饰的全局变量被存放在只读存储器中,修改const修饰的全局变量将导致程序崩溃。const修饰的static变量被存放在只读存储区,值被改变将导致程序崩溃。const修饰的普通局部变量在栈上分配空间,值可被改变。
const修饰函数参数表示在函数体内不希望改变参数的值,存放在只读存储区。
const修饰函数返回值表示返回值不可改变,多用于返回指针的类型,存放在只读存储区。
volatile
volatile关键字告诉编译器每次去内存中取变量值。
主要用于可能被多个线程访问的变量,可能被未知因素改变的变量。
struct
对于空结构体,一些编译器认为占用0个内存,一些编译器认为空结构体不应该存在。
柔性数组即数组大小待定的数组,C语言中可以由结构体产生柔性数组。
例如:
struct SoftArray
{
int len;int array[];
};
//此时,softarray中的array[]仅是一个待使用的标识符,不占内存空间。
使用方法:
struct SoftArray* sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * 5);
sa->len = 5;
union
union只分配最大成员的空间,所有成员共享这个空间。
union会受到系统大小端的影响。小端模式低字节存储低位数据,大端模式低字节存储高位数据。
例如:
union C
{
int i;char c;
};union C c;c.i = 1;printf(“c.c = %d\n”, c.c);
在小端模式下,int i的0x01存储在低位,c.c取低地址,程序输出结果为1;
在大段模式下,int i的0x01存储在高位,c.c取低地址,程序输出结果为0。
enum
enum是C语言中的一种根据需要自定义的整型值。
默认情况下,第一个定义的enum值默认为0,下一个的enum值是在前一个定义值的基础上加一。
enum定义的值是C语言中真正的常量。
sizeof
sizeof是编译器的内置指示符,并不是函数。
sizeof用于计算类型和变量所占内存的大小。
sizeof的值在编译期就已经确定,然后被具体的数值替换,程序的执行与sizeof没有任何关系。
sizeof用于变量有两种用法:sizeof(var)或sizeof var;sizeof用于类型:sizeof(type)。