結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。
前面我們通過「結構體變數名.成員名」的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。
前面講過,&student1 表示結構體變數 student1 的首位址,即 student1 第乙個項的位址。如果定義乙個指標變數 p 指向這個位址的話,p 就可以指向結構體變數 student1 中的任意乙個成員。
那麼,這個指標變數定義成什麼型別呢?只能定義成結構體型別,且指向什麼結構體型別的結構體變數,就要定義成什麼樣的結構體型別。比如指向 struct student 型別的結構體變數,那麼指標變數就一定要定義成 struct student* 型別。
下面將前面的程式用指標的方式修改一下:
# include # includestruct
age;
struct
student
;int main(void
)
輸出結果是:
name : 小明
birthday : 1989-3-29
num : 1207041
score : 100.0
我們看到,用指標引用結構體變數成員的方式是:
(*指標變數名).成員名
注意,*p 兩邊的括號不可省略,因為成員運算子「.」的優先順序高於指標運算子「*」,所以如果 *p 兩邊的括號省略的話,那麼 *p.num 就等價於 *(p.num) 了。
從該程式也可以看出:因為指標變數 p 指向的是結構體變數 student1 第乙個成員的位址,即字元陣列 name 的首位址,所以 p 和 (*p).name 是等價的。
但是,「等價」僅僅是說它們表示的是同乙個記憶體單元的位址,但它們的型別是不同的。指標變數 p 是 struct student* 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進行輸入或輸出時,輸入引數或輸出引數也只能寫成 (*p).name 而不能寫成 p。
同樣,雖然 &student1 和 student1.name 表示的是同乙個記憶體單元的位址,但它們的型別是不同的。&student1 是 struct student* 型的,而 student1.name 是 char* 型的,所以在對 p 進行初始化時,「p=&student1;」不能寫成「p=student1.name」。因為 p 是 struct student* 型的,所以不能將 char* 型的 student1.name 賦給 p。
此外為了使用的方便和直觀,用指標引用結構體變數成員的方式:
(*指標變數名).成員名
可以直接用:
指標變數名->成員名
來代替,它們是等價的。「->」是「指向結構體成員運算子」,它的優先順序同結構體成員運算子「.」一樣高。p->num 的含義是:指標變數 p 所指向的結構體變數中的 num 成員。p->num 最終代表的就是 num 這個成員中的內容。
下面再將程式用「->」修改一下:
# include # includestruct
age;
struct
student
;int main(void
)
C語言 結構體指標
asp.net unity開發 net培訓 期待與您交流!一.結構體 1.什麼是結構體 當 乙個整體 由多個資料構成時,我們可以用陣列來表示這個整體,但是陣列內部的每乙個元素都必須是相同型別的資料。在實際應用中,我們通常需要由不同型別的資料來構成乙個整體,比如學生這個整體可以由姓名 年齡 身高等資料...
C語言 結構體指標
指向結構體物件的指標變數即可以指向結構體變數,也可指向結構體陣列中的元素。指標變數的基型別必須與結構體變數的型別相同。如 struct student pt pt可以指向struct student型別的變數或陣列元素。典例 通過結構體變數的指標變數輸出結構體變數成員中的成員的資訊。解題思路 1 怎...
C語言結構體指標
在使用指標值得注意的是對結構體指標的使用 例如 struct bookmessage 定義乙個指標引數的結構體 void importmssage bookmessage pbook 那麼如何用該指標輸出該資訊呢?pbook name vs pbook id?void importmssage bo...