将const变量的地址分配给非const指针

时间:2014-07-22 17:37:00

标签: c pointers

我有一个问题

const int a=10;
int *ptr;
ptr = (int *)&a;

上面第三行中(int *)的用法是什么。

如上所述,如果我们有

char str[]="abc";
char *pc;
pc = str;

是上述转让权,如果是,那么为什么不是第一种情况。

4 个答案:

答案 0 :(得分:2)

如果没有该演员表,您将收到编译器警告。 & a是一个const int *而不是一个int *。

答案 1 :(得分:2)

“const int a”是一个常量整数。它无法修改。如果您尝试分配给它,编译器将不会让您。如果您成功地使用技巧来绕过编译器,您的程序可能会崩溃或更糟。

“int * ptr”是指向非常数整数的指针。如果你写了一个作业“* ptr = 100;”编译器将允许它没有任何问题。如果ptr是空指针或未定义,则会崩溃或更糟。如果ptr指向非常数整数,它将为该整数分配100。如果ptr指向一个常数整数,它将崩溃或更糟。

因此,编译器不允许您将a的地址分配给p。因为它要求麻烦。

现在分配“ptr =(int *)& a;”。 & a是a的地址。 a是常数整数,& a是指向常数整数的指针。 (int *)是强制转换。您告诉编译器将& a转换为“指向int的指针”。因为它是指向int的指针,而不是指向const int的指针,所以可以将它指定给ptr。但是ptr指出的东西仍然是一个,它仍然是不变的。

如果您读取 * ptr,这将正常工作。读* ptr将给出数字10.写入* ptr,如* ptr = 100,将崩溃或更糟。基本上,通过使用演员你告诉编译器“闭嘴,我知道我在做什么”。你最好做。

答案 2 :(得分:2)

- > const int i = 10;

i存储在只读区域中。(基本上告诉编译器该值不能更改)

i的类型为"const int"&i的类型为"const int *"

因此需要进行类型转换。

int *ptr = (int *)&i;与之匹配

你可以通过声明如下来避免它

`int const *ptr = &i;`        

p is of type "const int",类型不匹配

----------更新了您的查询-------

指向常量的指针可以通过以下两种方式声明。

1)const int *ptr; 要么 int const *ptr;两者都相同。

但不是这个---> 2)int *const ptr;与1st相同,这是指向变量的常量指针。

在案例1中)我们可以将指针更改为指向任何其他integer variable,但不能使用指针ptr更改value of object(实体)指向。

在案例2中)我们可以更改指针指向的value of object,但不能更改pointer to point another variable

答案 3 :(得分:0)

你需要强制转换,因为你忘了将ptr声明为指向常量int的指针:

int const *ptr;