1. 宏定义
例如: #define PI 3.1415926
#define Max(a,b) a>b ? a:b
int nRel = Max(2,3);
宏定义简单来说就是替换,名字上面的纯粹复制替代。由于宏在预处理阶段展开,例如上面宏定义PI,程序在该阶段就直接将PI的地方替换成3.1415926,然后执行编译。
所以宏定义不额外分配内存。
2. 常变量
C中是没有const定义常变量的概念的,这是C++中的应用。
例如: const double PI = 3.1415926;
(注意:常变量在定义时候就必须初始化。这和变量引用是一样的)
不可以:
const double PI;
PI = 3.1415926; //错误
const定义常变量与宏定义不同之处,它会在编译阶段执行类型检查。所以常变量定义时一定要表明数据类型。
const定义常变量也不可以修改其值:
const int nNum = 10;
nNum = 100; //错误,修改常变量存储的数据是不对的。
另外常变量最常用的地方是,一些函数希望传递过来的形参,不要在该函数内部随意修改数据。这样我们可以将函数形参定义为常变量,禁止函数内部修改。
例如统计字符串中是否存在空格,只做统计而不修改原字符串。可以声明函数:
bool GetStringSpace( const char *nzArr , int nLen);
3. 常引用
另外,还有一种常引用的应用。如果既要利用引用提高程序效率,又要保护传递给函数的数据不在函数中被修改,就使用常引用。
例如:
int nRel;
const int &nNum = nRel;
int &nCon = nRel;
nNum = 1; // 错误
nRel = 1; //正确
nCon = 2; //正确,常规引用也不可以另做其它变量名的别名,但是可以改变引用变量的值。
4. char *const p char const *p const char *p的区别
char *const p :指向char类型的常量指针,p指向的地址不可以修改的,但可以修改其指向变量的值。
char const *p :指向常变量的指针,指向的常量值不可以修改。
const char *p :有人说是指向字符的指针,该指针的值不可以修改。其实实际上和char const *p没有区别的,因为const和数据类型放置位置没有前后顺序,所以和char const *p等价。
虽然char const *p和const char* p等价,但是还是推荐写成const char*,因为为了防止和char *const p的区别,同时也更符合大众读写程序的习惯。
例如:
char nzA =1;
char nzB =2;
char* const p1 = &nzA;
*p1 = 1; //正确,可以修改常量指针指向变量的值;
p1 = &nzB; //错误,不可以修改p指向的地址。
*(p1++) =2; //错误,也不可以进行地址操作。
char nzArr[] ={1,2,3};
char nzArr1[] ={2,3,4};
char const *p2 = nzArr;
const char *p3 = nzArr; //char* 可以直接等价于 const char*
*p2 = "2222"; //错误,不可以修改常量值
*p3 = "2222"; //错误,同上
p2 = nzArr1; //正确,可以修改指针指向的地址
p3 = nzArr1; //正确,同上
转载请注明出处:CSDN 无鞋童鞋。