[英]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中有任何有效的變量聲明(沒有諸如extern
, static
或register
等的存儲類),則將typedef
放在最前面會變成變量名根據變量的類型轉換為新的類型名稱。
所以這里,沒有typedef
:
struct adjlistnode {int node; int cost; struct adjlistnode *next;}
**AdjMatrix;
AdjMatrix
是類型指向struct adjlistnode
指針的變量。
但是在您的帖子中,由於typedef
AdjMatrix
, AdjMatrix
是指向struct adjlistnode
指針的類型指針的名稱。
從typedef [添加重點]:
typedef是C和C ++編程語言中的保留關鍵字。 它用於為另一種數據類型創建別名 。 1因此,它通常用於簡化聲明由struct和union類型組成的復雜數據結構的語法,但在為長度可變的整數數據類型提供特定的描述類型名稱時也很常見。
AdjMatrix
是struct adjlistnode **
類型的替代名稱,它是指向struct adjlistnode
指針。
您可以使用它來聲明變量,如下所示:
AdjMatrix pp_st_adjlistnode;
這意味着pp_st_adjlistnode
是一個指向struct adjlistnode
指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.