【问题标题】:Pointer to constant in C [duplicate]指向C中常量的指针[重复]
【发布时间】:2023-04-07 19:47:01
【问题描述】:

我的常量指针有问题。这是我的代码:

#include <stdio.h>

typedef struct _duong                   
{
    int tuoi;
    int chieucao;
}duong;             

struct _duong DUONG;

typedef struct _duong *pduong;

const pduong p;

int main(void)
{
    p = &DUONG;
    p->tuoi = 25;
    p->chieucao = 165;
    printf("tuoi : %d\n",DUONG.tuoi);
    printf("chieucao : %d\n",DUONG.chieucao);
    return 1;
}

编译器抛出错误:无法分配给具有 const 限定类型“const pduong”的变量“p”。 我可以看到问题来自

const pduong p;

p = &DUONG;

据我了解,const pduong p 是一个指向常量的指针,因此我们无法更改指向变量的值,但我们可以更改它指向的地址。那么任何人都可以帮助我为什么编译器显示此错误?谢谢。

【问题讨论】:

  • 不要typedef指针,我的两分钟已经过去了......
  • 是常量指针,不是指向常量的指针。
  • 我知道常量指针和指向常量的指针之间的区别,但是您能否针对这种情况更具体地解释一下,为什么const pduong p这里是一个常量指针? @AnT
  • @Dương:点击上面的链接。或者在这里搜索。这个问题已在 SO 上多次解释、解释和过度解释。老实说,我想说的是你必须首先解释为什么你期望它是一个指向常量的指针。为什么真的?如果不了解您困惑的根源,就很难回答您的问题。

标签: c


【解决方案1】:

没有指针本身是一个常量。

即您不能更改指针。但无论指针指向什么,你都可以改变。

纠正此更改

const pduong p; 

const pduong p = &DUONG;

然后下线

 p = &DUONG;

编辑

也许你想要

const duong p_contents = {25, 165};
const pduong * const p = &p_contents;

【讨论】:

  • 如果这是 op 真正想要的,那么添加“指向 const DUONG 的指针”的语法是值得的
  • 也加const pduong const p
【解决方案2】:

这也是我强烈建议反对typedef-ing 指针类型的原因之一——const 语义适用于指针,而不适用于所指向的内容。

const pduong p;

意思

struct _duong * const p; // p is a const pointer to non-const type

不是

const struct _duong *p;  // p is a non-const pointer to const type

换句话说,您将p 声明为指向struct _duong常量指针,而不是指向const struct _duong 的指针。

就个人而言,我建议您完全放弃 typedef 并明确声明指针:

const struct _duong *p;

Typedef 非常适合抽象出细节,typedef-ing 指针类型很好如果用户不必知道类型的“指针性”。在这种情况下,用户确实必须知道p 的“指针特性”才能正确使用它,所以它的类型不应该隐藏在typedef 后面。

【讨论】:

    【解决方案3】:

    不,不能更改 const 指针的地址。只有它指向的值。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2021-04-19
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多