繁体   English   中英

为什么不能在之后设置 const 指针?

[英]Why can't a const pointer be set afterwards?

我知道这可能是一个微不足道的问题。 无法在声明后设置 const 指针背后的逻辑是什么? 分配内存不会改变 const 所指的起始地址。 那为什么这不能...

int* const p;
p = new int [10];

...完成...这也禁止将const指针传递给函数?

这就是const的全部目的。

const代表“常量”,表示不能分配对象。

如果您希望指针成为变量,请不要将其设为const

我怀疑您期望您的分配被允许,因为这是对该对象的第一次分配。 你错了! 这是您目前未使用的初始化的目的。

我猜你想写:

int* const p = new int[10];

但我担心你在这里有更根本的误解。 例如:

好像分配内存不会改变起始地址

是的,绝对,完全会。

当您的p存在时,它具有未指定的值。 它的值不是您可以使用的“起始地址”。

然后你分配给它(尽管你应该已经初始化了)。 它的值等于new返回的指针。 该指针与代码中之前的任何内容都没有关系。

分配内存确实会改变地址。 例如,如果我们有

int * foo;
foo = new int[bar];

foo未初始化并且具有垃圾值。 然后foo = new int[bar]; foo分配一个新地址,该地址是bar int s 块的开始。

现在当你有

int* const p;

指针是const所以我们不能在它初始化后改变它。

精简版

您定义指针的方式意味着它本身是const ,因此您不能重新分配它,您实际上必须将它连同它的声明一起分配

这里有更多关于const关键字的细节,即使它不是专门针对指针的使用。

请注意,以下代码不应该编译,因为您没有为 const 指针p赋值:

int main() {
    int * const p;
}

对于以下情况也是如此:

int main() {
    int const i;
}

它不取决于您正在处理指针的事实,而是const关键字实际如何工作以及应该/可以使用的方式。


关于常量和指针的更多细节

无论如何,我没有看到你的整个代码,在我看来你的意图不是有一个 const 指针,而是在你的情况下它可以帮助拥有一个指向 const 的指针(但这主要取决于你的问题,所以我可以是错的)。 当然,如何定义它们取决于您的目的。

您可以将其定义为const 指针或指向const 值的指针,两者的含义略有不同(当然,您也可以将指针定义为指向const 值的const 指针,这是一个很容易推导出的结果)上面提到的其他人)。

第一个表示指针本身不能重新分配,因此您必须在声明期间分配它,仅此而已。 第二个改为定义一个可重新分配的指针,但您只能为其分配给定类型的 const 变量的地址(或者更好,即使它们被定义为非 const,当通过该指针访问时,它们也将被视为 const,与案例的所有限制)。

下面是上面提到的const指针和const指针类型的简单例子:

int main() {
    int i;
    // pointer to const int
    int const *icp;
    // const pointer to int
    int * const cip = &i;
    // const pointer to const int
    int const * const cicp = &i;
    // this one can be reassigned, of course
    icp = &i;
}

还要注意int constconst int是可以互换的,所以下面的声明是等价的:

int const *p;
const int *p;

显然,这不是一个详尽的清单。 我只是试图向您提供有关在定义指针时如何使用const关键字以及这些声明的预期方法的更多详细信息。

int* const p;

声明p是一个不能改变的指针,即一旦它被初始化就不能改变它指向的位置。 但是,您可以更改它指向的值,因为它指向的对象类型是int

int* const p = new int [10];
p = new int[20]; // Not OK
p[0] = 100;      // OK

对比一下

int const* p = new int [10];
p = new int[20]; // OK. You can change where the pointer points to.
p[0] = 100;      // Not OK. You cannot change the value of what p points to.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM