Создание указателя непосредственно из определения структуры typedef - PullRequest
0 голосов
/ 21 января 2019

Я хочу проверить, что означает следующий код.Я думаю, что я создаю указатель на список указателей на adjlistnode структуры, но я не уверен.

Вот код:

typedef struct adjlistnode {int node; int cost; struct adjlistnode *next;}
    **AdjMatrix;

Я не совсем понимаю, что такое **AdjMatrix на самом деле.Как я уже говорил выше, я думаю, что это указатель на список указателей на adjlistnode структур, но я не уверен.Я прав в своем предположении?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Правила вокруг typedef можно упростить до следующего обобщения: если у вас есть допустимое объявление переменной в C (без класса хранения, такого как extern, static или register и т. Д.), затем привязка typedef впереди превращает имя переменной в имя нового типа, в зависимости от типа переменной.

Так вот, без typedef:

struct adjlistnode {int node; int cost; struct adjlistnode *next;}
    **AdjMatrix;

AdjMatrix - переменная типа указатель на указатель на struct adjlistnode.

Но в вашем посте из-за typedef, AdjMatrix - это имя для указателя типа на указатель на struct adjlistnode.

0 голосов
/ 21 января 2019

С typedef [выделение добавлено]:

typedef - зарезервированное ключевое слово в языках программирования C и C ++. Используется для создания псевдонима для другого типа данных .Как таковой, он часто используется для упрощения синтаксиса объявления сложных структур данных, состоящих из типов struct и union, но столь же распространен в предоставлении конкретных описательных имен типов для целочисленных типов данных различной длины.

AdjMatrix - это альтернативное имя типа struct adjlistnode **, которое является указателем на указатель на struct adjlistnode.

. Вы можете использовать его для объявления переменных следующим образом:

AdjMatrix pp_st_adjlistnode;

, что означает pp_st_adjlistnode - указатель на указатель на struct adjlistnode.

0 голосов
/ 21 января 2019

Я думаю, что это указатель на список указателей на структуры adjlistnode

Нет, это не так.

AdjMatrix становится типом, представляющим a pointer to pointer to struct adjlistnode

В качестве примера его можно использовать следующим образом:

AdjMatrix p = NULL; // p is now a pointer to pointer to struct adjlistnode

Код, по-видимому, предназначен для построения связанного списка, а AdjMatrix - это короткая рука для ссылки науказатель на указатель головы.Он может быть использован как:

void addNode(AdjMatrix pHead, int node, int cost)
{
    struct adjlistnode *tmp = malloc(sizeof *tmp);
    tmp->node = node;
    tmp->cost = cost;
    tmp->next = *pHead;
    *pHead = tmp;
}

void deleteNode(AdjMatrix pHead)
{
    if (*pHead)
    {
        struct adjlistnode *tmp = *pHead;
        *pHead = tmp->next;
        free(tmp);
    }
}

int main(void) {
    struct adjlistnode *head = NULL;

    // Add nodes
    addNode(&head, 1, 2);
    addNode(&head, 3, 4);
    addNode(&head, 5, 6);

    // ... use the list

    // Delete nodes
    while(head) deleteNode(&head);

    return 0;
}

Обратите внимание, что typedef указателей часто считается плохой практикой.Вместо этого было бы лучше сделать:

typedef struct adjlistnode {int node; int cost; struct adjlistnode *next;} AdjMatrix;

и использовать его как:

void addNode(AdjMatrix **pHead, int node, int cost)

, чтобы прояснить: pHead - это указатель на указатель на AdjMatrix

...