【发布时间】:2021-01-03 10:44:37
【问题描述】:
将常规指针 ptr2 分配给指向常量的指针 ptr1,如下面的代码所示,不会产生任何警告。
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 20;
const int *ptr1 = &a;
int *ptr2 = &b;
ptr1 = ptr2;
return 0;
}
但是,将指向常量的指针 ptr1 分配给常规指针 ptr2 会在编译期间产生警告,并且根据我正在关注的书(C Primer Plus by Stephen Patra),可能导致未定义的行为。
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 20;
const int *ptr1 = &a;
int *ptr2 = &b;
ptr2 = ptr1;
return 0;
}
据我了解,当一个指针赋值给另一个指针时,相当于让两个指针指向同一个对象。所以如果我要写一个图表,两种情况都应该是这样的。 根据我的图表,分配的顺序不会改变结果。无论我将 ptr1 分配给 ptr2 还是将 ptr2 分配给 ptr1 都应该给我相同的图表,但现在我不确定我的理解是否正确。谁能解释一下这两种情况不同的原因,请告诉我我画的图是否正确。
【问题讨论】:
-
FWIW,当我尝试编译您的第二个示例时出现错误:
invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive] -
@Dai :可能您使用的是 C++ 而不是 C 编译。在 C++ 中,这是一个需要大小写的错误(最好是
const_cast)。 -
@Dai :可能您使用的是 C++ 而不是 C 编译。在 C++ 中,这是一个需要强制转换的错误(最好是
const_cast)。