【问题标题】:Why can't I assign value of pointer to const int to a pointer of int? [duplicate]为什么我不能将指向 const int 的指针的值分配给 int 的指针? [复制]
【发布时间】:2021-03-23 01:40:43
【问题描述】:

[注意:我看到另一个问题询问同一本书中的同一部分,但出于不同的原因]
通读 C++ 入门书并正在阅读“顶级常量”部分。这里写道:

当我们复制一个对象时,顶层和低层的区别很重要。 当我们复制一个对象时,顶级常量被忽略
当我们复制一个对象时, 两个对象必须具有相同的低级 const 限定...

这是我理解的,但我继续操作并多次操作书中给出的示例,以进一步理解不同场景。下面的代码就是这样一种场景:

int i = 5;
int *p = &i;
const int *const ptr = p;
p = ptr;

在我运行程序之前,我已经假设第 4 行是合法的。然而,智能感知反而给我抛出了这个错误:

“const int *”类型的值不能分配给“int *”类型的实体

现在我已经完成了其他操作,例如 *p = *ptr(合法)、ptr = p(显然是非法的)并将对象 i 更改为 const(这将要求我更改 p并满足复制对象必须具有相同的低级 const 的条件)。在所有情况下,我都了解原因
但不适用于这种情况。有人可以解释为什么这是非法的吗?

【问题讨论】:

  • ptr 可能指向const int。您不希望非常量 int* 指向 const int
  • 经典的例子是这样的:char * p = "hello world"(以前是法律代码),然后是p[0] = 'y';。字符串文字“hello world”可能在只读存储中,使用p[0] = 'y'; 写入不可写存储是个坏主意。
  • @user4581301: char * p = "hello world"; 在 C 中仍然是合法的,如果你修改了 chars,它只是未定义的行为,所以它必须被视为“有效的 const”。 C++ 制作的文字实际上至少官方有const char 数据。

标签: c++ pointers constants


【解决方案1】:

首先考虑这个例子:

void foo(const int* p) {
     *x = 1;  // Error ! x is pointer to const
}

int x = 42;
foo(&x);

x 不是const。尽管如此,在foo 中,您不能通过const int* p 修改其值,因为它是指向const int 的指针。拥有指向const int 的指针并不意味着指向的int 实际上是const。这只意味着:您不能通过该指针修改int

编译器不会考虑您实际传递的指针,以查看 *x = 1; 不允许在 foo 内。

另一方面,int * 确实允许修改指向int 的指针。现在考虑一下:

 const int x = 42;
 const int* p = &x;
  
 int* p2 = p;  // Error ! why? 
 *p2 = 0;      // <- because of this

如果允许您将 const int* 分配给 int*,这将在 const 正确性方面造成漏洞,因为 int* 确实允许您修改指针。

顶级const in

 const int* const p3 = &x;

指的是指针本身。您不能修改指针。虽然你可以修改这个:

 const int* p4;
 p4 = &x;

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多