const非指针变量需要在声明时初始化,const指针类型可以声明时不初始化
const int n; // 错误
const int n = 4; //正确
const char *n; //正确 因为const修饰的是指针
char* const p; // 错误 const修饰的是变量p constant variable “p” requires an initializer
在函数中做形参
普通形参(非指针,非引用)前面加不加const对实参没有影响
非const指针只接受非const数据的地址
const指针接受const和非const数据的地址
非const引用只接受非const数据的地址
const引用接受const和非const数据的地址
将在函数中不希望被改变的传入参数形参声明为const,不影响实参类型(非const或const都行)
将指针参数声明为指向常量数据的指针有两个好处
可以避免由于无意间修改数据而导致的编程数据
使得函数可以处理const和非const实参,否则只能接受非const数据
const与指针在一起
char a[] = "jnh";
char* const p = a;
const char *n = a;
运行结果
由此可以看出
p是指针,里面存放的是变量的地址,p是常量,里面存放的地址不能变,但是他的指向是变量,可以变化
n是指针,里面存放的是变量的地址,n是变量,他可以变,但是她的指向是常量,不能变
有红色波浪线表示用法错误
给*p赋值,地址没变,地址里面的数据变了
给n赋值,相当于新的地址里面和放了原来的变量值
如何判断
将变量类型去掉之后,看const和变量之间有无指针或引用或其他关键字等
const p 说明修饰的是指针
const *n 说明修饰的是指针指向的那个变量
const和引用&
int a = 1;
int &b = a;
const int &c = a; //等价于 int const &c = a;
a = 5; // 改变a 的值
b = 4; // 此时 a = b = 4;
c = 4; //出错, 不能通过const引用改变变量的值