簡體   English   中英

直接從typedef結構定義創建指針

[英]Creating a pointer directly from a typedef struct definition

我想檢查以下代碼的含義。 我想我正在創建一個指向adjlistnode結構的指針列表的指針,但是我不確定。

這是代碼:

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

我對**AdjMatrix實際上是什么感到困惑。 就像我在上面說的那樣,我認為它是指向adjlistnode結構的指針列表的指針,但我不確定。 我的假設對嗎?

我認為這是指向adjlistnode結構的指針列表的指針

不,不是。

AdjMatrix成為代表a pointer to pointer to struct adjlistnode的類型

例如,它可以像這樣使用:

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

該代碼似乎是用於構建鏈接列表的,而AdjMatrix似乎是引用指向頭指針的指針的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

關於typedef的規則可以簡化為以下概括:如果您在C中有任何有效的變量聲明(沒有諸如externstaticregister等的存儲類),則將typedef放在最前面會變成變量名根據變量的類型轉換為新的類型名稱。

所以這里,沒有typedef

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

AdjMatrix是類型指向struct adjlistnode指針的變量。

但是在您的帖子中,由於typedef AdjMatrixAdjMatrix是指向struct adjlistnode指針的類型指針的名稱。

typedef [添加重點]:

typedef是C和C ++編程語言中的保留關鍵字。 它用於為另一種數據類型創建別名 1因此,它通常用於簡化聲明由struct和union類型組成的復雜數據結構的語法,但在為長度可變的整數數據類型提供特定的描述類型名稱時也很常見。

AdjMatrixstruct adjlistnode **類型的替代名稱,它是指向struct adjlistnode指針。

您可以使用它來聲明變量,如下所示:

AdjMatrix pp_st_adjlistnode;

這意味着pp_st_adjlistnode是一個指向struct adjlistnode指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM