1.修饰变量
1.1.const int* p
int n=10;
int m=20;
const int* p=&m;
//此时const修饰 *p,也就是p保存的地址里面的值不能改变,若*p=60,则会报错
但是可以改变p存放的地址:
p=&n;
printf("%d",*p);//打印结果是10
1.2. int* const p
int n=10;
int m=20;
int* const p=&n;
//此时const只修饰p,也就是p的值只能为&n,无法修改,若p=&m 会报错
但是可以改变*p的值:
*p=60;
//虽然p存放的&n无法修改,但是*p得到的n的值可以修改为60
printf("*p=%d,n=",*p,n);//打印结果为60,60
2.修饰函数
2.1.修饰函数的形参
void StringCopy(char* dest, const char* src);
这个字符串copy函数中,把src指向的字符串复制到dest中,也就是src的值是不需要改变的,而dest指针指向的值改变。对*src加上const后就可以防止其中的值被修改,起到保护作用。
而起到保护作呕也能够的原因是:
在实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个临时指针变量的地址与实参的地址不同,但却指向同一块空间地址。那么形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。当然,如果使用c++中的引用,效率会比指针更高,因为引用本身是一个变量,而这个变量仅仅是另外一个变量的别名,它不是指针,不占用内存空间,不会产生临时指针变量,并且不存在NULL空引用,无需assert,比指针更安全。同时,理论上指针的级数没有限制;但引用只有一级。
即不存在引用的引用,但可以有指针的指针。
2.2.修饰函数的返回值
如果用const修饰返回值类型为指针,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
const char * GetString(void);
//const修饰的函数返回值类型是char*
那么:
char *str = GetString();//报错,没有const修饰
const char *str = GetString();//正确