无效的类型参数 -> C结构体

33
我想访问一个包含结构体的数组,并按如下方式打印结构体字段。
printList(Album *a, int numOfStructs)
{
    int i;
    int j;

    for(i = 0; i < numOfStructs; i++)
    {
         printf("number%d\n:", i+1);
         printf("%s", a[i]->field2);
         printf("%s", a[i]->field2);
         printf("%d", a[i]->field3);

         for(j = 0; j < a[i]->numOfStrings; j++)
         {
             printf("%s", a[i]->strings[j]);
         }
         printf("\n");
    }
}

但我遇到了很多类似这样的错误

'->'的类型参数无效

我在使用这个指针时做错了什么?

2个回答

50

a 是指向 Album 对象数组的指针,因此 a[i] 的类型为 Album(它是由 a 指向的 Album 对象数组中的第 i 个元素)。

-> 操作符左操作数必须是一个指针;如果不是指针,则使用 . 操作符。


13
你需要使用点操作符.。当你对指针应用*时,你正在取消引用它。方括号[]也是相同的。 *[]之间的区别在于,方括号需要从指针中获取一个偏移量,然后将其添加到指针中的地址,然后才能取消引用。基本上,这些表达式是相同的:
*ptr == ptr[0]
*(ptr + 1) == ptr[1]
*(ptr + 2) == ptr[2]

与您的问题相连:将 a[i]->field2a[i]->field3 改为 a[i].field2a[i].field3


谢谢。我的程序的不同部分需要 -> 和其他部分需要 . ?我刚开始学习C语言,当我认为我理解了指针时,我意识到我一无所知。:( 当我尝试以下代码 fgets(&(tempAlbum->field1),MAXCHARACTERS, stdin); 我得到警告:从不兼容的指针类型传递参数1 'fgets' - some_id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接