const限定符 及其指针 的学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/84745788

本文主要区分 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 = &pi;

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;  // 错误,不能重新指向一个新的对象
}


猜你喜欢

转载自blog.csdn.net/abc15766228491/article/details/84745788