溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言的指針和結(jié)構(gòu)體怎么定義

發(fā)布時間:2022-03-22 16:02:58 來源:億速云 閱讀:311 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“C語言的指針和結(jié)構(gòu)體怎么定義”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言的指針和結(jié)構(gòu)體怎么定義”文章能幫助大家解決問題。

  指針和結(jié)構(gòu)體

前面我們講述指針的時候,已經(jīng)向大家介紹過使用指針去指向普通變量,指向函數(shù),指向數(shù)組,指向字符串等操作,由于當時還沒有介紹結(jié)構(gòu)體,因此是沒有講述指針指向結(jié)構(gòu)體的。但是,指針作為C語言中最具有標志性的特征,指向結(jié)構(gòu)體也是必定支持的,指向結(jié)構(gòu)體的指針就是本小節(jié)要討論的結(jié)構(gòu)體指針。

在討論結(jié)構(gòu)體指針之前,我們先來定義一個結(jié)構(gòu)體。定義這個結(jié)構(gòu)體的步驟為,先用“typedef”關(guān)鍵詞聲明一個結(jié)構(gòu)體的存儲類型。

typedef struct
{
char name[20];
int age;
int id_num;
} student_t;

接著,使用這個結(jié)構(gòu)體類型去定義一個結(jié)構(gòu)體變量,“student_t Xiaoming;”。

當這個描述小明信息的結(jié)構(gòu)體變量被定義好之后,實際上編譯器會在內(nèi)存上面開辟出一塊內(nèi)存區(qū)域來存儲這個結(jié)構(gòu)體變量,如圖1所示。

 C語言的指針和結(jié)構(gòu)體怎么定義

圖1 結(jié)構(gòu)體內(nèi)存排放

當這個結(jié)構(gòu)體內(nèi)存被定義好之后,我們可以使用“Xiaoming.結(jié)構(gòu)體成員名”的形式來訪問這個結(jié)構(gòu)體內(nèi)存的任意一個成員。那么這個結(jié)構(gòu)體變量的名稱具體代表的是什么呢?我們可以使用printf函數(shù)將這個結(jié)構(gòu)體變量名和內(nèi)部各個成員變量的地址打印出來,如圖2所示。很顯然,結(jié)構(gòu)體變量名的地址和結(jié)構(gòu)體中第一個成員變量的首地址是保持一致的,因此我們可以推理出,結(jié)構(gòu)體變量的名稱的地址就是代表著結(jié)構(gòu)體首地址。

C語言的指針和結(jié)構(gòu)體怎么定義

圖2 結(jié)構(gòu)體變量名的地址和成員變量的地址

基于上面討論的內(nèi)容,我們可以嘗試一下去定義一個指針,指向這個結(jié)構(gòu)體。但是這個指針究竟應(yīng)該定義什么類型的呢?前面我們講指針基礎(chǔ)的時候就說過,指向某個變量的指針,其數(shù)據(jù)類型應(yīng)該和其指向的內(nèi)容保持一致。那么指向這個結(jié)構(gòu)體的指針難道我們要使用struct類型的指針,如“struct *pt”?

很顯然,這是錯誤的,因為我們之前討論過,為什么指向某個變量的指針,其數(shù)據(jù)類型應(yīng)該和其指向的內(nèi)容保持一致。其根本原因是因為要使得指針的增長和其內(nèi)存保持一致的變化。因此,如果定義“struct *pt”這樣的指針,肯定是毫無意義的,語法上也肯定是不對的。

我們前面講結(jié)構(gòu)體的時候也說過,struct關(guān)鍵詞用來申明結(jié)構(gòu)體的時候,歸根到底聲明的其實是這個結(jié)構(gòu)體的存儲類型,因此對于這個結(jié)構(gòu)體,我們已經(jīng)用typedef將其聲明為一個新的數(shù)據(jù)類型了,所以要定義的這個指針應(yīng)該是“student_t *stu_pt;”。

現(xiàn)在指向這個結(jié)構(gòu)體的指針已經(jīng)被定義好了,那么接下來的內(nèi)容就應(yīng)該是如何指向這個結(jié)構(gòu)體。按照我們之前的經(jīng)驗,指向操作其實就是將指向?qū)ο蟮牡刂焚x值給一個指針變量,因此這個指向操作就非常簡單了,“stu_pt = &Xiaoming”。如圖3所示。

C語言的指針和結(jié)構(gòu)體怎么定義

圖3 定義指向結(jié)構(gòu)體的指針

從圖3中我們可以看到,此時指針的內(nèi)容和其指向的結(jié)構(gòu)體的首地址是一樣的,因此我們可以初步判斷這個結(jié)構(gòu)體指向操作是正確的。

現(xiàn)在我們已經(jīng)了解了如何去定義一個結(jié)構(gòu)體指針,以及如何去利用這個結(jié)構(gòu)體指針去指向一個結(jié)構(gòu)體,那么現(xiàn)在問題來了,我們定義結(jié)構(gòu)體的初衷是為了是某幾個相關(guān)的變量有序地排列在一起,并且對這個結(jié)構(gòu)體變量中的每一個成員都能引用,并且進行讀寫,而現(xiàn)在,我們定義好了一個結(jié)構(gòu)體指針并且指向了一個結(jié)構(gòu)體變量,那么我們能否使用這個結(jié)構(gòu)體指針去引用其指向的那個結(jié)構(gòu)體里面的成員變量呢?如果可以,那么該如何引用?

在回答這個問題之前,我們來回顧下,一個結(jié)構(gòu)體變量其引用指針的時候,是使用“結(jié)構(gòu)體變量名.成員變量名”的形式。那么對于一個結(jié)構(gòu)體指針來說,這種結(jié)構(gòu)體變量成員名稱的引用方式是不被允許的。對于一個指向結(jié)構(gòu)體變量的結(jié)構(gòu)體指針來說,我們應(yīng)該使用指向符號“->”來引用這個結(jié)構(gòu)體指針指向的結(jié)構(gòu)體變量的成員變量。這一點一定要切記。

如,我們可以利用“student_t”類型定義一個結(jié)構(gòu)體變量Xiaoming,接著再去使用一個結(jié)構(gòu)體指針去指向這個變量。我們先對Xiaoming這個結(jié)構(gòu)體變量里面的成員變量name賦值,接著使用結(jié)構(gòu)體指針去讀出。然后再使用結(jié)構(gòu)體指針對age變量賦值,接著再使用結(jié)構(gòu)體變量去讀出,如圖4所示。

C語言的指針和結(jié)構(gòu)體怎么定義

圖4 結(jié)構(gòu)體指針訪問結(jié)構(gòu)體變量

關(guān)于“C語言的指針和結(jié)構(gòu)體怎么定義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI