-> 的类型参数无效。帮我理解指点?

Invalid type argument of ->. Help me understanjd pointers?

所以我正在学习指针,我想我基本上了解它们的工作原理,但我仍在学习如何正确使用它们。

我写了这段代码,它接收一个指向带有指针的列表的指针,每个指针都指向一个名为 Data 的结构。 我想按数字组织它们,比如我有 [29-10, 28-10, 3-1] 结果将是 [ 3-1; 2-10; 29-10]

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int dia;
    int mes;
} Data;

void organiza(Data** l, int n)
{
    Data* aux, d1, d2;
    int j, i;
    for (i = 0;i<n-1;i++ )
    {
        for (j= i + 1;j<n;j++)
        {
            d1 = l[i];
            d2 = l[j];
            if (d1->mes > d2-> mes || (d1->mes == d2-> mes && d1->dia >= d2-> dia ))
            {
                aux == d1;
                d1 == d2;
                d2 == aux;
            }
        }
                
    }
}

这样做时我遇到了很多错误,我不明白为什么会这样:

error: incompatible types when assigning to type ‘Data’ {aka ‘struct ’} from type ‘Data *’ {aka ‘struct  *’}
d1 = l[i];
error: invalid type argument of ‘->’ (have ‘Data’ {aka ‘struct ’})
 if (d1->mes > d2-> mes || (d1->mes == d2-> mes && d1->dia >= d2-> dia ))

你的情况

Data* aux, d1, d2;

表示,aux是一个指针,d1d2不是。你需要写

Data *aux, *d1, *d2;

这个声明

Data* aux, d1, d2;

相当于

Data (* aux ), d1, d2;

或同

Data* aux;
Data d1, d2;

即变量 d1d2 的类型为 Data

例如在这些语句中

d1 = l[i];
d2 = l[j];

左操作数的类型为 Data 但赋值的右操作数的类型为 Data * 因为变量 l 的类型为 Data **宣言

void organiza(Data** l, int n)
              ^^^^^^^^

如果你想将变量d1d2声明为指针那么你需要写

Data *aux, *d1, *d2;