【问题标题】:Dereference c structure pointer to enable dot notation取消引用 c 结构指针以启用点表示法
【发布时间】:2014-11-08 22:52:27
【问题描述】:

有点愚蠢的问题,但我无法解决这个问题。我想使用点符号来访问结构的成员变量,以使一些杂乱无章的代码尽可能整洁。我希望我不会因为不想以传统方式去做而被告知。我正在尝试这样做: 类型定义结构{ 诠释一个; 诠释 b; } 我的结构;

mystruct myStArray[5];

void doit (mystruct *i) {
// I want to do this:
    i.a++;
    i.b++;
// rather than this:
    i->a++;
    i->b++;
// or this
    (*i).a++;
    (*i).b++;
}

main () {
    int x;
    for (x=0;x<5;x++) {
        doit(&myStArray[x]);
    }
}

我试过这样做:

void doit (mystruct *u) {
  mystruct i = *u;

但那确实有效。我知道它很简单,而且我以前也知道怎么做,但我生疏了,就是不记得/不知道怎么做。

【问题讨论】:

  • 可以#define i (*u),但我不会让它通过代码审查。
  • 请不要尝试更改 C 的语法。C 语法使用-&gt; 来访问指向结构的指针字段,您也应该这样做。
  • Magnus,这个答案是最好的,但我不能选择它作为评论。我接受你们关于代码审查和语法的观点,但这只是我将看到的一些代码,它将作为汇编程序进一步重新设计,所以保持它的标准不是我关心的问题。感谢两者。

标签: c syntax structure


【解决方案1】:

还有第三种“取消引用”数组的方法:indexing

 for(i=0; i < cnt; i++ ) {
    myarray[i].a = 42;
    ...
    }

【讨论】:

    【解决方案2】:

    通过指针访问结构成员的唯一选项是i-&gt;a(*i).a

    在 C++ 中,您可以编写 mystruct &amp;i = *u;,但这在 C 中无效。

    你可以复制结构体:

    mystruct j = *u;
    j.a++;
    

    并在需要时将其复制回来:

    *u = j;
    

    【讨论】:

    • 放松一下,你是对的,我在想 c++ refs。 Joops 的想法我已经在其他地方做了,但就在这段代码中,我希望稍微修剪一下文本,因此不适合这里。我认为 Matt 和 Unwinds 的答案是相同的,所以我必须选择一个。上面的马格努斯评论是最好的答案,但他把它放在评论中,所以我不能提名它作为答案。谢谢大家。
    【解决方案3】:

    这个:

    mystruct i = *u;
    

    将编译并运行,但当然不会影响传递给doit()mystruct 实例中的数据。它将在本地副本中运行,该副本将在函数退出时被丢弃。

    没有办法做你想做的事,你真的应该使用-&gt; 符号。

    也许您正在考虑 C++ 的引用?

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 2013-01-04
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多