在C/C++中, const修饰指针变量, 有三种情况, 以 int* 为例, 三是以下种情况
原则: const修饰谁, 谁就不能被修改, 否则编译出错
第一种 和 第二种: const int* p; 和 int const * p;
这两种情况是相同的, 这两种情况变量p的类型是const int* 型, 此时const修饰的就是p所指向的内容, 也就是说p解引用之后的值不
能被修改, 这种情况可以不用在定义变量时初始化 .
第三种 : 情况是 int* const p = &a;
这种情况p的类型为int* const, 此时const修饰的是指针变量p, 所以说p的值不能变, 换句话说就是指针指向不能改变
这种情况下, 常指针变量必须在定义时初始化, 也就是在定义时就给常指针一个值, 如: int* const p = &a;
不光是常指针, 所有的常量都只能在定义时给初值, 之后不能再改变常量的值. 所以说, 定义常指针不给赋初值的行为, 虽然编译器
不会报错, 但这种行为是无意义的, 因为这个常指针是一个野指针, 还不能给它再赋值, 程序中也就不能使用. 所以说要在定义时初始化.
扩展 :
那么const int* const p = &a; 或 int const * const p = &a; 呢?
这两个声明含义相同, 是第一(二) 种 和 第三种 的结合, const即修饰了指针所指内容, 也修饰了指针本身, 所以不管是指针的指向
还是指针所指的内容, 都不可改变
const int const * const p = &a; 这种写法是错的, int左右的两个const 重复修饰了p所指向的内容, 编译报错
第一种 举例如下:
#include<stdio.h>
int main() {
int arr[10];
int a = 10;
const int* p1;
const int* p2;
//可以在定义时初始化
//如const int* p1 = arr;
//const int* p2 = &a;
p1 = arr;//正确
p2 = &a;//正确
*p1 = 10;//错误
*(p1 + 1) = 10;//错误
p1[0] = 10;//错误
p1[1] = 10;//错误
*p2 = 20;//错误
p1 = &a;//正确
p2 = arr;//正确
return 0;
}
第二种 举例如下:
#include<stdio.h>
int main() {
int arr[10];
int a = 10;
int const * p1;
int const * p2;
//可以在定义时初始化
//如int const * p1 = arr;
//int const * p2 = &a;
p1 = arr;//正确
p2 = &a;//正确
*p1 = 10;//错误
*(p1 + 1) = 10;//错误
p1[0] = 10;//错误
p1[1] = 10;//错误
*p2 = 20;//错误
p1 = &a;//正确
p2 = arr;//正确
return 0;
}
第三种 : 举例如下
#include<stdio.h>
int main() {
int arr[10];
int a = 10;
int* const p1 = arr;
int* const p2 = &a;
int* const p3;//编译不会报错, 但没有意义
int* const p4;//编译不会报错, 但没有意义
p3 = arr;//错误
p4 = &a;//错误
*p1 = 10;//正确
*(p1 + 1) = 10;//正确
p1[0] = 10;//正确
p1[1] = 10;//正确
*p2 = 20;//正确
p1 = &a;//错误
p2 = arr;//错误
return 0;
}