【问题标题】:Pointer to array structure指向数组结构的指针
【发布时间】:2025-12-31 13:45:10
【问题描述】:

我有一个小程序,编译时会抛出以下错误

错误 #2168:“+”的操作数具有不兼容的类型“结构议程”和“整数”。

错误 #2113:'.' 的左操作数具有不兼容的类型“int”。

错误 #2088:需要左值。

这是我做的代码

#include <stdio.h>

struct agenda{
    int order, cellular;
    char name[30], last_name[30], street[30], city[30], mail[50];
}contact[10];

int main(void)
{
    struct agenda *ptrcontact;
    ptrcontact = &contact[0];

    (*ptrcontact+3).order = 3;

    printf("\n\n %d", (*ptrcontact).order);
    return 0;
}

因为它会抛出这些错误以及如何修复它们?

【问题讨论】:

  • 什么是*ptrcontact?它的contact[0]。您应该尝试类似:(ptrcontact + 3)-&gt;order = 3;
  • (*ptrcontact+3) 为您提供(结构议程)的任何 ptrcontact 点,并在其中添加 3(int)。 * 的优先级高于 +,因此为了获得第三个索引,您必须编写:*(ptrcontact + 3) 或 ptrcontact[3]。

标签: c arrays pointers struct


【解决方案1】:

你需要改变

(*ptrcontact+3).order = 3;

ptrcontact[3].order = 3;

或者,至少,

(*(ptrcontact+3)).order = 3;

或者,

(ptrcontact + 3)->order = 3;

否则,根据precedence rule* 的优先级高于+,从而导致错误。

补充一点,ptrcontact 是一个指针(指向struct agenda),可以用作+ 运算符的操作数。

OTOH,*ptrcontact 的类型为 struct agenda,不能用作 + 运算符的操作数。

【讨论】:

    【解决方案2】:

    您正在取消引用产生结构的指针,显然您不能向其中添加任何内容。取消引用运算符具有最高优先级,您需要这样做:(*(ptr + 3)).order 或使用箭头代替星点:(ptr + 3) -&gt; order

    【讨论】:

    • 这个人真的花了我这么长时间才打字
    【解决方案3】:

    您的问题是操作优先级:

     (*ptrcontact+3).order = 3;
    

    这会取消引用ptrcontract,然后尝试将数字添加到取消引用的结构中。这为您提供了您报告的确切情况。

    我的建议:

    在这种情况下,要么避免使用地址算法。操作数组索引。

    int baseIndex = 0;
    contact[baseIndex + 3].order = 3;
    

    或者如果你真的必须这样做,从外部隐藏地址算术:

    (pcontact + 3)->order = 3;
    

    最后学习C language operations priority 或者,做一次(但有些C 人不喜欢C++),C++ operations priority

    【讨论】:

    • 这是一个 c 问题,提供的链接将包含在 c 语言中甚至无效的运算符。 en.cppreference.com 是 c++ 资源,而不是 c 资源。
    • 没错。但是所有有效的操作优先级都如 C 程序员所期望的那样;-)。这只是为了在 C++ 开始时不再学习它们。
    • 我不认为每个 c 程序员都必须学习这么难看的语言。
    • :-))) 我有点同意你的看法。我在 C++11 之后迁移到 Java,然后是 Scala。实际上,C++ 现在对于单一语言来说太复杂和太宽泛了——这会导致“多种语言合二为一”。但现实是 - C 程序员经常学习 C++ 并且(这使得交易)然后他们回到 C 并成为真正的程序员 - 之后他们开始与语言无关。 :-|
    • 好的,我同意至少应该首先提及 C 优先级。
    【解决方案4】:

    错误在行中 (*ptrcontact+3).order = 3;和 printf("\n\n %d", (*ptrcontact).order);.在本说明中,使用 -> 而不是 .错误将得到解决。

    【讨论】: