C++ const int *p 和 int* const p区别
背景
在看Effective C++ 条款03的时候,看到了关于
const 和 *
不同位置代表的不同含义,想彻底搞明白,记录一下。
结论
const int *p: const在星号的左边(限制的是*p),表示被指物是常量。这句话的意思是不能通过指针p来修改指向的变量的值,但指针p仍然可以指向其他的变量。
int* const p: const在星号的右边(限制的是p),表示指针自身是常量。这句话的意思也就是p只能指向一个变量,不能指向其他的变量!也可以通过p修改所指向变量的值。
const int* const p: const出现在星号两边,表示被指物和指针两者都是常量。这里就真的是一个常量了…
编写代码验证const int* p
// test.cpp
#include <iostream>
int main(void)
{
using std::cout;
using std::endl;
int a = 10;
const int* p = &a;
cout << "a = " << *p << endl;
*p = 1000; // 这里想通过指针p来修改变量a的值
cout << "a = " << *p << endl;
}
编译
g++ test.cpp
发现报错
error: assignment of read-only location ‘* p’ --- (*p)是只读的
修改代码如下
// test.cpp
#include <iostream>
int main(void)
{
using std::cout;
using std::endl;
int a = 10;
int b = 20;
const int* p = &a;
cout << "a = " << *p << endl;
p = &b;
cout << "b = " << *p << endl;
}
编译链接运行
g++ test.cpp
./a.out
输出结果
a = 10
b = 20
故:const int *p :指针p可以指向多个变量,但不能通过指针p来修改所指向的变量的值。
编写代码验证int* const p
// test.cpp
#include <iostream>
int main(void)
{
using std::cout;
using std::endl;
int a = 10;
int b = 20;
int* const p = &a;
cout << "a = " << *p << endl;
p = &b; // 这里想修改p所指向的变量
cout << "b = " << *p << endl;
}
编译发现报错
error: assignment of read-only variable ‘p’ (指针p是只读的)
修改代码如下
// test.cpp
#include <iostream>
int main(void)
{
using std::cout;
using std::endl;
int a = 10;
int* const p = &a;
cout << "a = " << *p << endl;
*p = 100; // 这里通过指针p来修改所指向变量a的值
cout << "a = " << *p << endl;
}
输出
a = 10
a = 100
故:int * const p :可以通过指针p来修改所指向的变量的值,但指针p不能指向其他的变量!
编写代码验证const int* const p
// test.cpp
#include <iostream>
int main(void)
{
using std::cout;
using std::endl;
int a = 10;
const int* const p = &a;
cout << "a = " << *p << endl;
*p = 100; // 这里通过指针p来修改所指向变量a的值
cout << "a = " << *p << endl;
}
编译
test_overload_cout.cpp:30:5: error: assignment of read-only location ‘*(const int*)p’
30 | *p = 1000;
| ~~~^~~~~~
故:const int* const p是真正的常量,无法被修改!
END: 纸上得来终觉浅,绝知此事要躬行!