指向数组结构的指针

时间:2015-02-08 14:12:53

标签: c arrays pointers struct

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

  

错误#2168:' +'的操作数有不兼容的类型和结构议程'和' int'。

     

错误#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;
}

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

4 个答案:

答案 0 :(得分:6)

您需要更改

(*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类型,不能用作+运算符的操作数。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这里的问题是操作优先级:

 (*ptrcontact+3).order = 3;

这会导致ptrcontract,然后尝试将数字添加到dereferred结构中。这会为您提供报告的确切情况。

我的建议:

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

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

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

(pcontact + 3)->order = 3;

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

答案 3 :(得分:0)

错误在于行 (* ptrcontact + 3).order = 3;和printf(&#34; \ n \ n%d&#34;,(* ptrcontact).order);.在本说明书中使用 - &gt;代替 。错误将得到解决。