基本数据类型的初始值跟编译器有很大关系,不是所有编译器int初始值都为0,因此除非你的代码不需要移植,并且对编译器非常了解,否则就应该手动进行初始化。下面再来看看常量,通过#define PI=3.14 定义别名和const int PI=3.14都可以定义常量,区别是#define是预编译替换指令,不在系统中创建变量名。用const定义的是一个不允许改变值的变量,显然使用const更加标准,而且含义更加清楚。
如果定义基本数据类型的常量,则常量的值不允许修改,如果将struct定义为常量则既不能对结构体常量进行赋值也不能修改结构体成员的值。对于全局变量和常量,初始化时必须使用常量,某些编译器更加严格,甚至不允许用一个常量初始化另一个常量,例如下面代码在VS中不允许但在gcc中可以通过编译:
const int MM = 0;
int XX = 2+MM;//在VS中不允许,但在gcc中允许
指针常量有三种定义方式:
const int *p const int是一个整体,表示p指向的内容不可修改,但p可以指向其它地址,我们将这种指针称为常量指针
int *const p const p是一个整体,表示指针p不可修改,但p指向的内容可以发生变化,将这种指针称为指针常量
const int *const p 表示p和它指向的内容都不能修改
记住const和接在它后面的部分是一个整体,拥有最高结合度。当将一个常量指针赋值给一个变量指针时,我们仍然可以通过变量指针修改指向的内容,但这种操作被视为不安全的,编译器会给出警告,有的编译器直接报错。但是将一个变量指针赋值给常量指针是安全的,很多标准库函数都采用此方法来保