C

C语言相关知识点深入理解

第一关:C和指针

整型

整型分为有符号和无符号。

整型值相互之间的规则是:长整型至少应该和整型一样长,而整型至少应该和短整型一样长。

浮点类型

浮点数在缺省情况下都是double类型的,加L或l表示为long double类型的,或者加F或f表示是float类型的值。

宽字符常量

如果一个多字节字符常量前面带有一个L,那么他就是宽字符常量。例如:L‘X’

作用域

代码块作用域

位于一对花括号之间的所有语句都称为一个代码块,任何在代码块的开始位置声明的标识符都具有代码块作用域。

文件作用域

任何在所有代码块之外声明的标识符都具有文件作用域。

原型作用域

原型作用域只适用于在函数原型中声明的参数名。

函数作用域

函数作用域只适用于语句标签,指在函数内声明的所有变量在函数体内始终是可见的,可以在整个函数的范围内使用及复用。

枚举类型

枚举类型的实质是以整型形式进行存储的,符号名其实都是整型值。如果某个符号未显式复制那个他的值就比前面的一个符号名的值大1。第一个未命名的初始化为0。

可变参数列表

可变参数列表是通过stdarg宏实现的,位于stdarg.h头文件。函数声明了一个var_arg的变量,用于访问参数列表未确定部分,通过调用va_start来初始化,第一个参数是va_list变量的名字,第二个参数是省略号前最后一个有名字的参数。为了访问这个参数,需要使用va_arg这个宏,这个宏接受两个参数,va_list和参数列表中下一个参数的类型。访问完毕后使用va_end函数。

字符串常量

K&R C并没有提及一个字符串常量中的字符是否可以被修改,但是其表明具有相同值的不同字符在内存中是分开存储的,因此许多编译器运行程序修改字符串常量。

ANSI C则表明如果对一个字符串常量进行修改,效果是未定义的。他也允许编译器将一个字符串常量存储于一个地方,即使其在一个程序中多次出现。因此许多ANSI C编译器不允许修改字符串常量。

字符串常量在程序中使用会生成一个”指向字符的常量指针”。

char *message = "Hello";
/*等价于
char *message;
message = “Hello”;
*/

指针与常量

int const *p;//可以修改指针的值,无法修改指针指向的值
int * const p1;//指针为常量无法修改,指针指向的值可以修改
int const * const p2;//指针的指向和指针指向的值都不可以改变