【问题标题】:Understanding Pointer to constant pointer to integer constant (const int * const * variable)理解指向常量的指针指向整数常量的指针(const int * const * variable)
【发布时间】:2014-11-22 18:27:58
【问题描述】:

举个例子

const int limit = 500;
const int * const cpci = &limit;
const int * const * pcpci = &cpci;

我很难理解最后一行的含义。

基本上在数组术语中,值 pcpci 只是 (const int * const) 的数组。但我似乎无法在 pcpci 内制作多个副本,因为它不应该是一个常量指针。

举例

const int limit = 500;
const int * const cpci = &limit;
const int * const * pcpci = &cpci;
const int limit2 = 600;
const int * const cpci2 = &limit2;
*(pcpci+1) = &cpci2;

在上面代码的最后一行我得到“错误左值必须是可修改的”。但我想知道为什么会发生这种情况,因为 pcpci 不是常量指针,只有它的元素应该是常量且不可修改。

【问题讨论】:

  • 这与数组无关。
  • "pcpci 它只是一个数组" 不,指针不是数组。

标签: c pointers constants


【解决方案1】:

首先声明

*(pcpci+1) = &cpci;

具有未定义的行为,因为您不能取消引用不指向对象的指针。如果pcpci 指向数组的一个元素并且pcpci + 1 也指向同一个数组的下一个元素,则可以使用这种结构。

这样写会更直接

*(pcpci) = &cpci;

但是pcpci 指向的对象是一个类型为T const 的常量对象,其中T 是const int *,因此它可能不会被重新分配。

你可以重写定义会更清楚

const int * const * pcpci = &cpci;

以下方式

typedef const int * const ConstPointerToConstObject;

ConstPointerToConstObject * pcpci = &cpci;

因此,如果取消引用pcpci,您将获得一个ConstPointerToConstObject 类型的对象,因为它是一个指向常量对象的常量指针

【讨论】:

    【解决方案2】:

    但我想知道为什么会发生这种情况,因为 pcpci 不是常量指针

    不,但*(pcpci+1) 是。它的类型为const int* const。显然你不能给它分配任何东西。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2020-10-23
      相关资源
      最近更新 更多