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

问题描述 投票:0回答:4

我有一个问题:

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

上面第三行的(

int *
)有什么用?

就像上面一样,如果我们有:

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

以上分配正确吗?

如果是,那为什么不是第一种情况?

c pointers constants
4个回答
3
投票

-->

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;
与第一个相同,这是指向变量的常量指针。

在情况 1 中)我们可以更改指针以指向任何其他

integer variable
,但不能更改使用指针 ptr 指向的
value of object
(实体)。

情况2)我们可以改变指针指向的

value of object
,但不能改变
pointer to point another variable


2
投票

如果没有该转换,您将收到编译器警告。 &a 是 const int * 不是 int *。


2
投票

“const int a”是常量整数。它无法修改。如果你尝试给它赋值,编译器不会让你这样做。如果你成功地耍花招来绕过编译器,你的程序可能会崩溃或更糟。

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

因此,编译器不允许将 a 的地址分配给 p。因为这是自找麻烦。

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

如果您阅读 *ptr,这将工作得很好。读取 *ptr 将给出数字 10。写入 *ptr,例如 *ptr = 100,将会崩溃或更糟。基本上,通过使用强制转换,您告诉编译器“闭嘴,我知道我在做什么”。你最好这样做。


0
投票

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

int const *ptr;
© www.soinside.com 2019 - 2024. All rights reserved.