您好,登錄后才能下訂單哦!
今天小編給大家分享一下C語言指針和結(jié)構(gòu)體實例分析的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
指針和結(jié)構(gòu)體
前面我們講述指針的時候,已經(jīng)向大家介紹過使用指針去指向普通變量,指向函數(shù),指向數(shù)組,指向字符串等操作,由于當(dāng)時還沒有介紹結(jié)構(gòu)體,因此是沒有講述指針指向結(jié)構(gòu)體的。但是,指針作為C語言中最具有標(biāo)志性的特征,指向結(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;”。
當(dāng)這個描述小明信息的結(jié)構(gòu)體變量被定義好之后,實際上編譯器會在內(nèi)存上面開辟出一塊內(nèi)存區(qū)域來存儲這個結(jié)構(gòu)體變量,如圖1所示。
圖1 結(jié)構(gòu)體內(nèi)存排放
當(dāng)這個結(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)體首地址。
圖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所示。
圖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)體變量中的每一個成員都能引用,并且進(jìn)行讀寫,而現(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)體變量的成員變量。這一點(diǎn)一定要切記。
如,我們可以利用“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所示。
圖4 結(jié)構(gòu)體指針訪問結(jié)構(gòu)體變量
以上就是“C語言指針和結(jié)構(gòu)體實例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。