指向結構變數的指標
一個指標變數當用來指向一個結構變數時,稱之為結構指標變數。結構指標變數中的值是所指向的結構變數的首地址。透過結構指標即可訪問該結構變數,這與陣列指標和函式指標的情況是相同的。
結構指標變數說明的一般形式為:
struct 結構名 *結構指標變數名
例如,在前面的例題中定義了stu這個結構,如要說明一個指向stu的指標變數pstu,可寫為:
struct stu *pstu;
賦值是把結構變數的首地址賦予該指標變數,不能把結構名賦予該指標變數。如果boy是被說明為stu型別的結構變數,則:
pstu=&boy
是正確的,而:
pstu=&stu
是錯誤的。
結構名和結構變數是兩個不同的概念,不能混淆。結構名只能表示一個結構形式,編譯系統並不對它分配記憶體空間。只有當某變數被說明為這種型別的結構時,才對該變數分配儲存空間。因此上面&stu這種寫法是錯誤的,不可能去取一個結構名的首地址。有了結構指標變數,就能更方便地訪問結構變數的各個成員。
其訪問的一般形式為:
(*結構指標變數).成員名
或為:
結構指標變數->成員名
例如:
(*pstu).num
或者:
pstu->num
應該注意(*pstu)兩側的括號不可少,因為成員符“.”的優先順序高於“*”。如去掉括號寫作*pstu.num則等效於*(pstu.num),這樣,意義就完全不對了。
下面透過例子來說明結構指標變數的具體說明和使用方法。
【例】
struct stu
{
int num;
char *name;
char sex;
float score;
} boy1={102,"Zhang ping","M",78.5},*pstu;
main()
pstu=&boy1;
printf("Number=%d\nName=%s\n",boy1.num,boy1.name);
printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);
printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);
printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);
printf("Number=%d\nName=%s\n",pstu->num,pstu->name);
printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);
}
本例程式定義了一個結構stu,定義了stu型別結構變數boy1並作了初始化賦值,還定義了一個指向stu型別結構的指標變數pstu。在main函式中,pstu被賦予boy1的地址,因此pstu指向boy1。然後在printf語句內用三種形式輸出boy1的各個成員值。從執行結果可以看出:
結構變數.成員名
這三種用於表示結構成員的形式是完全等效的。
指向結構變數的指標
一個指標變數當用來指向一個結構變數時,稱之為結構指標變數。結構指標變數中的值是所指向的結構變數的首地址。透過結構指標即可訪問該結構變數,這與陣列指標和函式指標的情況是相同的。
結構指標變數說明的一般形式為:
struct 結構名 *結構指標變數名
例如,在前面的例題中定義了stu這個結構,如要說明一個指向stu的指標變數pstu,可寫為:
struct stu *pstu;
賦值是把結構變數的首地址賦予該指標變數,不能把結構名賦予該指標變數。如果boy是被說明為stu型別的結構變數,則:
pstu=&boy
是正確的,而:
pstu=&stu
是錯誤的。
結構名和結構變數是兩個不同的概念,不能混淆。結構名只能表示一個結構形式,編譯系統並不對它分配記憶體空間。只有當某變數被說明為這種型別的結構時,才對該變數分配儲存空間。因此上面&stu這種寫法是錯誤的,不可能去取一個結構名的首地址。有了結構指標變數,就能更方便地訪問結構變數的各個成員。
其訪問的一般形式為:
(*結構指標變數).成員名
或為:
結構指標變數->成員名
例如:
(*pstu).num
或者:
pstu->num
應該注意(*pstu)兩側的括號不可少,因為成員符“.”的優先順序高於“*”。如去掉括號寫作*pstu.num則等效於*(pstu.num),這樣,意義就完全不對了。
下面透過例子來說明結構指標變數的具體說明和使用方法。
【例】
struct stu
{
int num;
char *name;
char sex;
float score;
} boy1={102,"Zhang ping","M",78.5},*pstu;
main()
{
pstu=&boy1;
printf("Number=%d\nName=%s\n",boy1.num,boy1.name);
printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);
printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);
printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);
printf("Number=%d\nName=%s\n",pstu->num,pstu->name);
printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);
}
本例程式定義了一個結構stu,定義了stu型別結構變數boy1並作了初始化賦值,還定義了一個指向stu型別結構的指標變數pstu。在main函式中,pstu被賦予boy1的地址,因此pstu指向boy1。然後在printf語句內用三種形式輸出boy1的各個成員值。從執行結果可以看出:
結構變數.成員名
(*結構指標變數).成員名
結構指標變數->成員名
這三種用於表示結構成員的形式是完全等效的。