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

时间:2015-11-04 18:39:15

标签: c++ function pointers const

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

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

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

4 个答案:

答案 0 :(得分:9)

这是const的全部目的。

const代表"常数",表示无法将对象分配给。

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

我怀疑你期望你的作业被允许,因为它是第一次分配给那个对象。你错了!这是初始化的目的,您目前没有使用它。

我猜你打算写:

int* const p = new int[10];

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

  

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

是的,绝对,完全会。

当您的p出现时,它的值未指定。它的价值不是起始地址"你可以使用。

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

答案 1 :(得分:2)

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

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

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

现在你有了

int* const p;

指针为const,因此我们无法在初始化后更改它。

答案 2 :(得分:2)

短版

你定义指针的方式意味着它本身就是const,所以你不能重新分配它,你实际上已经将它与声明一起分配

Here有关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关键字以及这些声明的预期方法的更多详细信息。

答案 3 :(得分:1)

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.