本文主要区分 const cname* 和 cname *const的区别
文中定义出自《c++ primer中文版》(第四版)
1. 指向const对象的指针
如果指针指向const对象,则不允许用指针来改变其所指的const值。为了保证这个特性,c++语言强制要求指向const对象的指针也必须有const特性。
例:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
double c = 11.0;
const double d = 12.0;
const double e = 13.0;
const double *cptr; // 指向const对象的指针
cptr = &c; // 正确,指向const对象的指针可以指向非const对象
cptr = &d; // 正确,可以指向const对象
cptr = &e; // 正确,指针可以指向别的const对象
*cptr = 13.0; //错误,不能修改
}
上面的例子中,cptr是一个指向double的const对象的指针,const限定了cptr指针所指向的对象类型,并非cptr本身。也就是说,cptr本身并不是const。在定义时不需要对他进行初始化,如果需要的话,允许给cptr重新赋值,使其指向另一个const对象,但不能通过cptr修改所指对象的值
2. const 指针
除指向const对象的对象外,c++语言还提供了const指针——本身的值不能修改:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
double c = 11.0;
const double d = 12.0;
double e = 13.0;
// double *const cptr1; // const指针,这里没有初始化,错误
double *const cptr = &c; // 正确,const指针可以指向非const对象
*cptr = 100.0; // 正确,const指针可以修改指向对象的值
// double *const cptr = &d; // 错误,这里const指针不能指向const对象,因为允许该指针修改指向的对象的值
// cptr = &e; // 错误,const指针不能修改其指向的对象
}
3. 指向const对象的const指针
本例中,既不能修改pi_ptr所指对象的值,也不能修改该指针的指向(即pi_ptr中存放的地址值)
const double pi = 3.1415;
const double *const pi_ptr = π
4. 指针和typedef
假设给出以下语句:
typedef string *pstring;
const pstring cstr;
那么,cstr变量是什么类型?
const string *cstr; // 错误
string *const cstr; // 正确
例:
#include <iostream>
#include <cstring>
using namespace std;
typedef string *p;
int main()
{
const string str1="hello";
string str2 = "hello";
string str3 = "there";
// const p str=&str1; // 错误
const p str = &str2; // 正确
*str = "world"; // 正确,可以修改
str = &str3; // 错误,不能重新指向一个新的对象
}