在学习指针的时候,经常会遇到指针常量、常量指针这两个概念。
指针常量: 就是说指针自己是常量,指针本身的地址不能变,但是指针指向地址的值可以变
常量指针: 指针指向地址的值,是常量不能修改。但是指针本身可以修改,可以让指针指向其他地址。
这两个概念比较绕,下面通过代码对他们进行区分。
指针:
#include <iostream>
using namespace std;
int main(){
int a = 123;
int b = 234;
int *const p = NULL;
p = &a;
cout << "addr of a: " << &a << "\t p: " << p << "\t p point to: " << *p << endl;
p = &b;
cout << "addr of b: " << &b << "\t p: " << p << "\t p point to: " << *p << endl;
}
指针常量:
指针本身的地址不能变,但是指针指向地址的内容可以变
#include <iostream>
using namespace std;
int main(){
int a = 123;
int b = 234;
int *const p = &a; //p是指针常量,p本身是常量,p的地址不能变
cout << "addr of a: " << &a << "\t p: " << p << "\t p point to: " << *p << endl;
*p = b; //p指向的地址不变,只是地址上存放的值改为变量b的值
p = &b; //!!!编译报错, assignment of read-only variable 'p'
cout << "addr of b: " << &b << "\t p: " << p << "\t p point to: " << *p << endl;
}
初始化:p是指针常量,int *const p = &a 指向 a 的地址。
√: 可以通过 *p = b 修改a所在地址的值
×: 不能用 p = &b 来修改p所指的地址
常量指针:
指针指向地址的内容不能变,指针本身的地址可以变
#include <iostream>
using namespace std;
int main(){
int a = 123;
int b = 234;
const int *p = &a; //p是常量指针,p指向地址的值是常量
cout << "addr of a: " << &a << "\t p: " << p << "\t p point to: " << *p << endl;
*p = b; //!!!编译器报错,assignment of read-only location '* p';
p = &b; //可以修改p的地址,即让p指向其他地址
cout << "addr of b: " << &b << "\t p: " << p << "\t p point to: " << *p << endl;
}
初始化:p是常量指针,const int *p = &a 指向 a 的地址。
√: 可以通过 p = &b 修改指针p所指向的地址
×: 不能用 *p = b 来修改a的地址上的值