指向const指针(或指向const的指针)

时间:2014-11-29 13:15:22

标签: c++ pointers

我有这段代码:

#include <iostream>

int main(){

    int v1 = 20;

    int *p1 = &v1;
    int **p2 = &p1;

    return 0;
}

我想要做的是将指针指向另一个指针,在这种情况下它可以正常工作。

我将p1指向const指针或指向const的指针:

int *const p1 = &v1; OR
const int *p1 = &v1;

现在我的代码不起作用了。 考虑第一种情况。 int *const p1 = &v1;。 这是我更新的代码,我认为应该是正确的:

#include <iostream>

int main(){

    int v1 = 20;

    int *const p1 = &v1;
    const int **p2 = &p1;

    return 0;
} 

使指针本身const意味着它不能指向另一个对象,但它指向的那个对象的值可以改变。因此,如果我想指向另一个指向前一个指针p1的指针,我需要确保第二个指针不能用于更改p1的值所以我做了它(p2 )指向const的指针。但它不起作用。

错误::来自&#39; int * const *&#39;的无效转换到&#39; const int **&#39; [-fpermissive]

同样,第二种情况也失败了。我认为我的代码应该是正确的:

#include <iostream>

int main(){

    int v1 = 20;

    const int *p1 = &v1;
    int **p2 = &p1;

    return 0;
} 

使指针指向const意味着指针不能用于更改它指向的对象的值。但是,指针可以改变它自己的值,也就是说它可以指向其他对象。由于我可以更改指针的值,因此第二个指针不需要指向const。

错误:来自&#39; const int **&#39;的无效转换到&#39; int **&#39; [-fpermissive]

我正在使用GNU CC编译器 我是C ++的新手,我迷失了。我想知道如何指向与const有关的其他指针。

4 个答案:

答案 0 :(得分:3)

  

我想知道如何指向与const有关的其他指针。

显然,你也需要在指向指针的地方使用const

int *const p1 = &v1;
int *const* p2 = &p1;


const int *p1 = &v1;
const int **p2 = &p1;

基本规则非常简单,如果您有T类型的变量,则指向它的指针的类型为T*。因此,如果你有int * const *,那么指向它的指针是int * const **,而不是const int **,这是指向不同类型的指针。

  

因为我可以改变指针的值,所以第二个指针不需要指向const。

不,那是不正确的。

如果C ++允许您可以修改const数据,或者尝试尝试:

const int v1 = 0;
const int* p1 = &v1;
int** p2 = &p1;
int* p3 = *p2;
*p3 = 1;              // modifies v1, which is const!

规则的要点是强制类型安全,不允许您使用指向非const的指针指向const数据。

答案 1 :(得分:3)

你的第一次重写不起作用,因为你试图将一个常量指针的地址分配给一个指向指针的指针,其中最后一个&#34; pointee&#34; (即int)是常量,而不是中间的指针。换句话说,如果C允许这个

int *const p1 = &v1;
const int **p2 = &p1; // Not allowed

它应该允许这样:

*p2 = &v2; // This would be legal.

然而,这会修改指针p1,据称它是不变的。

以下是第一次重写需要更改的内容:

int *const p1 = &v1;
int * const *p2 = &p1;

注意const如何从声明之前移动到星号之间。现在你要指向一个指向int的常量指针。

你的第二次重写失败了,因为它完全放弃了const。要修复它,请将const放回声明的开头:

const int *p1 = &v1;
const int **p2 = &p1;

答案 2 :(得分:1)

int *const p1 = &v1;

这句话说p1是"constant pointer to integer"

const int **p2 = &p1;     //wrong

虽然这是说p2是指向"pointer to constant integer"的指针,这与你的第一个陈述相矛盾。

所以第二个陈述应该是(如果第一个陈述没有改变): -

int* const *p2 = &p1;

可以说p2是指向"constant pointer to integer"的指针。

OR

第一个陈述应该是(如果第二个陈述不变): -

const int *p1 = &v1;

可以说p1是"pointer to constant integer"

答案 3 :(得分:1)

有帮助的是从右到左书写const(或一般的cv资格)。

int const* p1 = &v1;

int const* *p2 = &p1;

没关系。

int      * const p1 = &v1;

int const*      *p2 = &p1;

那不行。

int const*  p1 = &v1;
int      * *p2 = &p1;

那也不行。

你能发现这种模式吗?