1、C语言中仅有4种基本数据类型:整型、浮点型、指针、聚合类型(数组和结构等);
2、变量的最小范围:
char 0-127
signed char -127-127
unsigned char 0-255
short int -32767-32767
unsigned short int 0-65535
int -32767-32767
unsigned int 0-65535
3、对于数组来说,数组的下标总是从0开始的,最后一个元素的下标是元素的数目减1;
4、对于数组下标的有效性的注意事项:
如果下标值是从那些已知是正确的值计算得来,那么就无需检查它的值,如果一个用作下标的值是根据某种方法从用户输入的数据产生得来的,那么在使用这个数组之前就必须进行检测,确保没有越界;
5、尽量避免使用隐式声明;
6、创建新的类型名的时候,应该使用typedef而不是#define,因为后者无法正确处理指针类型;
#define d_ptr_to_char char *
d_ptr_to_char a, b;
这样a是正确声明了,但是b却声明为了字符类型;
7、关于const的理解:
(1)int *pi : pi是一个指向整型的指针;
(2)int const *pi :pi是一个指向整型常量的指针,指针的值可以修改(地址可以修改),但是指向的值不能修改;
(3)int *const pi : 无论是指针或者是它所指向的值都是常量,都是不能修改的;
使用const声明一个常量的目的是不仅使你的意图在其他阅读程序的人面前能够更清晰的展现,而且当这个值被意外的修改时,编译器能够发现这个问题并报错;
8、作用域有4种类型:文件作用域、函数作用域、代码作用域、原型作用域(标识符声明的位置决定它的作用域);
9、关于代码作用域的理解:
(1)首先先理解代码块的定义,位于一对花括号之间的所有语句称为一个代码块;
(2)任何在代码块的开始位置声明的标识符都具有代码作用域;
(3)代码块处于嵌套状态时,如果内层代码块有一个标识符与外层的同名,那么在内层代码块中,内层的那个标识符就将隐藏外层的标识符;
我们应该尽量避免在嵌套的代码块中出现相同的变量名;
10、链接属性分为3种:external(外部的)、internal(内部的)、none(无);
属于internal链接属性的标识符在同一个源文件内的所有声明都是指同一个实体,但是在多个源文件的多个声明则分属不同的实体;
属于external链接属性的标识符不论声明多少次,位于几个源文件中都表示同一个实体;
11、关键字extern和static可以用来改变标识符的链接属性
static只对缺省链接属性为external的声明才有改变其链接属性的效果;
当extern关键字用于源文件中一个标识符的第一次声明时,它指定该标识符具有external链接属性,但是用于该标识符的第二次或以后的声明时,它不会改变由第一次指定的链接属性(第一次或者是internal或者是external);
12、存储变量的三个地方:普通内存,运行时堆栈,硬件寄存器(变量存储类型是指存储变量值的内存类型);
13、变量的存储类型取决于它们声明的位置
(1)凡是在任何代码块之外声明的变量总是存储在静态内存中(程序运行前创建,并且如果没显式赋值则创建时缺省的赋于一个初始值0,在程序执行完毕后销毁);
(2)在代码块内部声明的变量是存储在堆栈中(在程序执行到声明自动变量的代码块时创建,在离开这个代码块时销毁,如果加上关键字static可以将其修改为静态变量,但是不改变该变量的作用域,仅仅改变其存储类型);
14、关于static这个关键字的注意点:
当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但是标识符的存储类型和作用域不受影响,用这种方式声明的函数或变量只能在声明它们的源文件中进行访问;
当它用于代码块内部变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响,用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期内一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁;
总之,static关键字是根据环境进行修改变量或标识符的链接属性和存储类型,而对作用域是没有影响的;
15、具有external链接属性的实体总是具有静态存储类型;