将指向const类型的指针初始化为非const类型

时间:2014-01-30 16:29:07

标签: c pointers const

有可能吗?

我的意思是这样的:

const int *a;
int x=6;
a=&x;

另一个问题是,是否可以从上到下继续:

int const *b = a;

3 个答案:

答案 0 :(得分:3)

您可以将指向对象类型的指针转​​换为指向其他对象类型的指针。特别是,您可以将int *转换为const int *,反之亦然。

即使您通过指向非const类型的指针,也不能修改使用const定义的对象。

const intint const是相同的,因此允许使用int const *b = a;

允许

a = &x;;将指向int的指针转换为指向const int的指针是安全的。

答案 1 :(得分:2)

所以,让我们重复一些声明:

  1. 指向常量整数的指针。以下两个声明是相同的。

    const int * x;
    int const * x;
    

    此外,指针在这里不是常量。因此,我们可以更改x指向的内容。

    const int * x;
    x = malloc(sizeof(int)); // Legal
    

    但是,我们无法更改x指向的值:

    *x = 3; // Illegal.
    
  2. 指向整数的常量指针。

    int * const x;
    

    在这种情况下,我们无法改变x指向的内容,但我们可以更改内容。所以......

    int * const x = malloc(sizeof(int));
    *x = 3; // Legal
    x = NULL; // Illegal
    
  3. 我们也可以同时做这两个问题。 (指向常量数据的常量指针)

    const int * const x;
    int const * const x;
    

    并显示非法行动:

    int const * const x = malloc(sizeof(int));
    x = NULL; // Illegal
    *x = 3; // Illegal
    

答案 2 :(得分:1)

关于你的问题

 int const *b = a;

此处a是指向const int的指针。 b具有相同的类型(确切地说)。因此,您可以毫无问题地使用b初始化a

总结上面针对a=&x;给出的答案,您可以安全地将指针从类型T转换为类型const T,而不是相反。原因是,从类型Tconst T的转换不会破坏对象,因为指向const类型的指针只会读取对象而不会写入。但另一种方式,从const TT的转换可能会写入const T