【问题标题】:How does operator precedence and typecasting work here运算符优先级和类型转换如何在这里工作
【发布时间】:2014-09-11 02:05:07
【问题描述】:

好的,所以我在这里写关于指针的工作,我不确定这段代码是如何工作的。

typedef struct linkedlist {
    void *obj;
    struct linkedlist *next;
} linkedlist;
linkedlist *p;

//some code here

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question

如果我需要对 p->next 指向的结构中的 void 指针 'obj' 进行类型转换(假设它已经存在)并将其复制到 'newpointer' int 指针,我这样做对吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。您是否咨询过您的编译器是否适合您所做的工作?你的调试器呢?为什么要存储void * 而不是int *?为什么要用 C 和 C++ 对它进行双重标记?这看起来更像 C 代码而不是 C++,因为 C++ 确实不需要 typedef。将 int 分配给 int * 应该会生成编译警告。
  • 你好乔恩,我刚刚阅读了关于页面。我看到我在那里做了什么。只是我有一个链接列表,其中包含指向任何数据类型所需的元素。这意味着我必须使用 void 指针来进行简单的类型转换。我知道 void 类型转换很糟糕。只是设计规范是这样的。我还在掌握调试器。以后会更加勤奋。
  • 有时,无论好坏,都会给出设计。请记住不要使用 C 和 C++ 双重标记。除此之外,如果你学会了,那很好;这就是我们来这里的目的。

标签: c


【解决方案1】:
int *newpointer = (*(int *)(p->next)->obj); //code chunk in question

如果我需要对 p->next 指向的结构中的 void 指针 'obj' 进行类型转换(假设它已经存在)并将其复制到 'newpointer' int 指针,我这样做对吗?

没有。编译器会告诉你的。您也不需要所有这些括号:

int *newpointer = (int *)p->next->obj;

【讨论】:

  • 如果可以的话,我会 +1(这里是新手)。我真的应该更多地关注那些编译器消息。
  • @solaremperor 你应该total关注他们。一个编写良好的程序根本不会生成任何编译器消息。追踪你得到的每一个,并问问自己为什么会导致它。
【解决方案2】:

您正在尝试使用已转换指针的 取消引用 值初始化指针 newpointer,这是一个错误。 Gcc 说:

错误:从 'int' 到 'int*' 的无效转换

移除对解引用操作符的调用:

int *newpointer = (int*) p->next->obj; // Also stripped unnecessary parentheses.

【讨论】:

    【解决方案3】:

    在 C 中,类型转换运算符的优先级低于成员访问运算符。因此,

    (int*)p->next->obj = (int*)(p->next->obj) = (int*)((p->next)->obj)
    

    如果成员访问运算符具有更高的优先级,您将使用:

    int *newpointer = (int*)(p->next->obj);
    

    既然不是,你可以省略所有的括号并使用:

    int *newpointer = (int*)p->next->obj;
    

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 2020-11-14
      • 1970-01-01
      • 2016-02-19
      • 2017-07-04
      • 2019-05-15
      • 1970-01-01
      • 2012-05-04
      • 2021-01-01
      相关资源
      最近更新 更多