我知道这可能是一个微不足道的问题。在声明之后无法设置const指针的逻辑是什么?这并不是说分配内存会改变const引用的起始地址。那么为什么不能这样......
int* const p;
p = new int [10];
...完成...这也禁止将const指针传递给函数?
答案 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指针类型和指针的简短示例:
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 const
和const 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.