理解c語言結構體指標

2021-10-06 13:07:39 字數 1816 閱讀 9777

void

changei

(int i)

void

changei

(int

*p)void

changep

(int

*p)int

main()

如上所示:

**僅用於本示例,不糾檔案結構,函式申明什麼的。

從主函式從上往下輸出:

前四個輸出 :

i = 21, j = i;是常見的賦值語句,即變數j的值現在為21。

*p1 = &i, *p2 = &i;現在p1,p2均為i的位址。

*p1 = 23;在主函式中很容易理解,將p指向的位址的值改為23,而p1本身的值沒變,p2與p1的值相同,均指向變數i在記憶體中的位址,此位址的值現在被修改為23,即i的值現在為23。

前三條對應四個printf()。

第乙個changei中,我們傳入的i,系統以值得方式傳入,即傳入的不是變數i,而是變數i的值,即傳入了23;在函式內的i為函式區域性變數,值為23,所以+=2得到25,隨後輸出25;

回到主函式,再次輸出i,主函式中的i未發生變化。

第二個changei,傳入i的位址,此時傳入的則對應主函式中的變數i,因此在函式內改變了主函式中的i,輸出兩次均為23+=2的結果;

隨後changei,傳入p1的值,即傳入了變數i的位址,同上,輸出了兩次27。

changep中,我們傳入了p2的值,即i的位址,然後將此值賦值為null,注意:p2僅記錄了i的位址, 其值得變化並不會導致i得位址發生變化,因此i與p1都為收到影像,且p2由於傳值得原因,也為收到影響。最後兩次輸出的值分別為null與i得位址。

思考如何在函式中改變p2的值

我們應該將p2得位址傳入函式。p2記錄了i得位址,但其本身也是變數,也存在記憶體中,也有位址。

思考將int型別變成結構體

如果我們定義指標,而不定義變數,希望給指標所指區域賦值,則需要先申請空間。

建立了乙個結構體指標st,並申請了空間

建立了乙個結構體變數stu

試圖對stu呼叫賦值函式,注意本例通過引數不同,區分函式,如同int型別,我們傳入stu被視為傳入結構體的值,無法修改結構體本身,因此輸出函式亂碼,如果不加stu.id賦值,則系統報錯未初始化。

傳入結構體指標變數,成功修改所指向的值,其中(*stu)表示指標指向的結構體,stu->可以找的結構體中的變數。

傳入stu的位址,結果同上。

指標使用只需要注意以下幾點:

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

結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。前面我們通過 結構體變數名.成員名 的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。前面講過,student1 表示結構體變數 student1 的首位址,即 student1 第乙個項的位址。如果定義乙個指標變數 p 指...

C語言 結構體指標

asp.net unity開發 net培訓 期待與您交流!一.結構體 1.什麼是結構體 當 乙個整體 由多個資料構成時,我們可以用陣列來表示這個整體,但是陣列內部的每乙個元素都必須是相同型別的資料。在實際應用中,我們通常需要由不同型別的資料來構成乙個整體,比如學生這個整體可以由姓名 年齡 身高等資料...

C語言 結構體指標

指向結構體物件的指標變數即可以指向結構體變數,也可指向結構體陣列中的元素。指標變數的基型別必須與結構體變數的型別相同。如 struct student pt pt可以指向struct student型別的變數或陣列元素。典例 通過結構體變數的指標變數輸出結構體變數成員中的成員的資訊。解題思路 1 怎...