最近在STM的GPIO結構體定義中看到源代碼的時候,順便復習下結構體指針變量的定義及typedef 的使用。
1.結構體類型定義
定義方式1:
Typedef struct LNode { int data; // 數據域 struct LNode *next; // 指針域 } *LinkList;
定義方式2:
struct LNode { int data; // 數據域 struct LNode *next; // 指針域 }; Typedef struct LNode *LinkList;
以上兩個定義方式是等價的,是將 *LinkList 定 義為 struct LNode 類型,即 LinkList 被定義為一個類型名。這樣就可以用 LinkList來定義說明新的變量了,如:
LinkList L;
結構體變量與結構體指針變量的使用方法
一、結構體的定義格式一般如下:
Typedef struct SCI
{
U8 data[MAXLEN];
U16 pos;
}TSCI;
二、訪問結構體成員的基本方法有兩種:
1、定義一個結構體變量直接訪問成員變量;
2、定義一個結構體指針變量間接訪問結構體變量。
(1) 結構體變量訪問
TSCI Sci1;
Sci1.data [ Sci1.pos++]= num;
(2) 結構體指針變量訪問
TSCI *Sci2,b;
Sci2= &b; //指針變量必須初始化 指向一個結構體變量
Sci2->data[Sci2->pos++] = num;
(3)(*Sci1).data Sci2->data 效果等效
三、如何實現結構體被其他函數調用
假設A文件中定義了一個結構體,B文件可以對A中定義的結構體進行訪問和修改數據。
1、 在A.h中定義結構體
Typedef struct SCI
{
U8 data[MAXLEN];
U16 pos;
}TSCI;
2、在A.c文件中聲明一個結構體變量
TSCI Sci;
3、要實現B.c文件能夠調用A中的結構體,需要做到兩點:
(1)在B.h中包含A.h頭文件;
(2)A.c中實現返回結構體變量地址的函數。
實現函數如下:
TSCI * Get_Address(void) //返回結構體變量的地址 (此TSCI結構體須在A.h中定義)
{
Return &Sci;
}
(4)在B.c中定義一個結構體指針變量,通過調用Get_Address函數得到Sci的地址,將此地址賦給B.h中定義的結構體指針變量。
TSCI *pSci2;
pSci2 = Get_Address();
pSci2->data[pSci2->pos++]=num;
這樣就可以實現對A.c中的結構體變量Sci的數據訪問、修改。