C ++新手。关于常量指针的问题

时间:2009-07-10 15:42:32

标签: c++ pointers const

我正在尝试通过一些网络教程学习C ++。我没有可用的编译器,否则我会尝试这个。我不确定const指针是什么意思。这只是意味着它总是指向相同的内存地址吗?你为什么要这样做?以下代码是否合法?

...
int * const aPointer = new int;
... //do something with aPointer
delete aPointer;
... //do something else, including possibly more 'new' statements
aPointer = new int;
...

10 个答案:

答案 0 :(得分:18)

记住const如何使用指针的简单方法是记住它总是适用于它左边的任何内容,除非它是最左边的关键字,在这种情况下它适用于右边。

示例:

指向常量字符的指针: 指针可以更改为指向其他内容,但它最初指向的char不能更改值。

const char * p;

指向char的常量指针: 指针不能更改为指向其他任何内容,但它指向的char可以更改值。

char *const p;

指向常量char的常量指针: 指针不能更改为指向其他任何内容,它指向的char不能更改值。

const char *const p;

答案 1 :(得分:9)

Const指针可能意味着一些不同的东西。我建议您查看有关此问题的C++ FAQ Lite

你可以:

const int* p;
int* const p;
const int* const p;

这三个意味着不同的东西。是的,这有点令人困惑。

在你的情况下,你有第二个,这意味着你有一个指向非常量对象的常量指针。也就是说,您可以通过指针更改整数的值,但不能更改指针指向的内容。所以你发布的代码不合法​​。

答案 2 :(得分:3)

你只能通过阅读书籍来学习驾驶汽车。

如果您想学习C ++,请自己学习C ++编译器。 g ++是免费的,以及Visual Studio 2008 Express Edition。

至于你的问题,const指针是一个只准备就绪的内存区域。示例:类可以提供对内部缓冲区的只读访问权限。

请注意,您还有const指针也是const,也就是

const char * const p 

在这种情况下,甚至无法修改指针的值。

答案 3 :(得分:2)

天儿真好,

为了轻松记住这一点,你可以使用Scott Meyers在其出色的书“Effective C ++”中描述的技巧(sanitised Amazon link

您通过星号所在的声明画一条线。

  • 如果关键字const出现在该行的左侧,则您无法更改您指向的项目的值。
  • 如果关键字const出现在该行的右侧,则无法将指针更改为指向其他位置。
  • 如果const出现在双方,则无法更改指针,也无法更改指向的值。

BTW那本书很棒,虽然不适合初学者,但绝对是将你的C ++知识提升到一个新水平的一种方式!强烈推荐。

HTH

欢呼声,

答案 4 :(得分:1)

const指针意味着您可以更改指向的变量的值,但不能更改指针指向的位置。我自己并不经常使用它们,但const指针的常见应用是定义您需要解决的特定内存段。有关详细信息,请参阅this question

顺便说一下,如果可以的话,你应该尝试在你的计算机上安装一个编译器。我已经多次证明自己的大脑是糟糕的C ++编译器。

答案 5 :(得分:1)

您的代码不合法​​。您不能分配给aPointer(除了使用复制样式初始化,实际上即使它看起来不是赋值),如果aPointer被声明为const那样。

但通常当人们说“常量指针”时,他们的意思是const int * aPointer,而不是代码中的int * const aPointer。整个互联网将解释一滴帽子的差异。据我所知,标准中没有定义“const指针”这个术语,所以即使它可能令人困惑,我们也可以自由地这样做。 “Pointer-to-const”将是一个明确的描述,并且指向const的指针比指针 - 本身就是const更常用。

指针 - 本身是const用于引用某些东西,你不希望指针在其生命中的任何一点引用不同的东西。例如,this是一个指针 - 它本身就是const,因为“this object”通过执行成员函数保持相同的对象。 C ++语言选择不允许您通过部分方式决定是否要为this分配一些其他值,以使其引用其他对象。在C ++中,引用通常也用于此目的,因为它们无法“重新定位”以更改引用。

答案 6 :(得分:0)

在您的代码中,指针无法移动,但指向的数据可能会发生变化。

第一次删除是合法的。后续的新功能不起作用,因为它是对常量的赋值。

看到这个是相对不寻常的,更常见的是看到指向的数据不可更改但指针可以移动。

int bar;
int baz;
const int * foo = &bar;
*foo = 4; // illegal
foo = &baz; // legal

指针和值都是const是常见的字符串

const wchar_t * const myString = L"String that will never change.";

答案 7 :(得分:0)

由于您是C ++新手,对于此问题的答案以及您可能拥有或不知道的许多其他问题,请查看C++ FAQ

答案 8 :(得分:0)

  

我没有可用的编译器,否则我会尝试这个

每个人都有可用的C ++编译器:http://www.online-compiler.com

还有很多其他的,但这似乎有用......

答案 9 :(得分:0)

正如已经指出的那样,也许最常见的const指针是

const char* p;

变量p可以改变,但数据p指向的是不可修改的。

但是,将const关键字移到星号的左边并不会改变声明的含义:

char const* p;

我更喜欢后者,因为在声明常量指针的const指针时,更容易记住将const关键字放在哪里:

char const* const* p;

同样,变量p可以改变,指向的数据是不可修改的。此外,数据被声明为const指针,这意味着它指向无法修改的数据。

此类型的更常见表示法是

const char* const* p;

将const关键字立即放置在它修改的星号的左侧(或者用于参考的&符号)可以很容易地创建涉及const关键字的复杂类型。例如,指向const指针的指针:

char const** p;

和指向指针的const指针:

char* const* p;

请记住从右到左“读取”指针声明,并且不要在每个语句中声明多个指针以避免混淆。