結構體指標,C語言結構體指標詳解

2022-03-04 23:47:53 字數 1605 閱讀 2867

結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。

前面我們通過「結構體變數名.成員名」的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。

前面講過,&student1 表示結構體變數 student1 的首位址,即 student1 第乙個項的位址。如果定義乙個指標變數 p 指向這個位址的話,p 就可以指向結構體變數 student1 中的任意乙個成員。

那麼,這個指標變數定義成什麼型別呢?只能定義成結構體型別,且指向什麼結構體型別的結構體變數,就要定義成什麼樣的結構體型別。比如指向 struct student 型別的結構體變數,那麼指標變數就一定要定義成 struct student* 型別。

下面將前面的程式用指標的方式修改一下:

# include # include 

struct

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 # include 

struct

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...