gpt4 book ai didi

c++ - 关于 "int const *p"和 "const int *p "

转载 作者:可可西里 更新时间:2023-11-01 17:04:24 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
int i1 = 0;
int i2 = 10;

const int *p = &i1;
int const *p2 = &i1;
const int const *p3 = &i1;

p = &i2;
p2 = &i2;
p3 = &i2;

cout << *p << endl
<< *p2 <<endl
<< *p3 <<endl;
return 0;
}

代码可以用VC6.0和VC2010编译。但我有以下问题:

const int *p = &i1;

意思是“p”点不能修改,但是p不能修改,对吗?所以

p = &i2;

这条线可以遵守,是吗?

这一行:

int const *p2 = &i1;

在我看来,这意味着 p2 不能修改,而 p2 点可以更改,对吗?为什么

p2 = &i2;

可以编译吗?

关于这一行:

const int const *p3 = &i1;

p3 = &i2;

哦,天啊……我疯了。我不知道为什么可以毫无错误地编译这一行...任何人都可以帮助我吗?

另一个让我困惑的代码在这里:

class Coo2    
{
public:

Coo2() : p(new int(0)) {}

~Coo2() {delete p;}


int const * getP() const
{
*p = 1;
return this->p;
}

private:
int* p;
};

为什么这段代码可以编译?在

int const * getP() const

我已经更改了值或 *p !

最佳答案

这里我们考虑 4 种类型的指针声明:

  1. int * w;这意味着 w 是一个指向整数类型值的指针。我们可以修改指针及其内容。如果我们在声明时初始化 w 如下:int * w = &a;
    那么,下面两个操作都是可行的:
    w = &b;(真)
    *w = 1;(真)

  2. int * const x;
    这意味着 x 是一个指向整数类型值的常量指针。如果我们在声明时初始化 x 如下:
    int * const x = &a;
    然后,我们不能这样做:x = &b;(wrong) 因为 x 是一个常量指针,不能被修改。
    但是,可以这样做:*x = 1;(true),因为 x 的内容不是常量。

  3. int const * y;//意思相同
    const int * y;
    这意味着 y 是一个指向常量整数值的指针。如果我们在如下声明时初始化 y:
    int const * y = &a;
    然后,可以这样做:y=&b;(true) 因为 y 是一个非常量指针,可以指向任何地方。
    但是,我们不能这样做:*y=1;(错误),因为y指向的变量是一个常量变量,不能被修改。

  4. int const * const z;//意思相同
    const int * const z;
    这意味着 z 是指向常量整数值的常量指针。如果我们在如下声明时初始化 z:
    int const * const z = &a;
    因此,以下操作均不可行:
    z = &b;(错误)
    *z = 1;(错误)

关于c++ - 关于 "int const *p"和 "const int *p ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com