c语言结构体介绍及用法
生活随笔
收集整理的這篇文章主要介紹了
c语言结构体介绍及用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,為什么要使用結構體??????
?????? 在語言中,為了表示一些復雜的數據, 而普通的基本變量類型無法滿足要求。
?????? 例如要定義1個學生類型, 學生有3個屬性 sid, name, age
?????? 那么在面向對象語言里(例如java),我們可以寫1個類
? ? ? ?? 可以見到在類里面有屬性,有方法, 可以很好地表示了這個類型的結構。
???????? 而c語言不是面向對象語言, 折衷地,就可以使用結構體來表示復雜結構的類型。
二,什么是結構體
???????? 結構體是根據用戶實際需要自己定義的符合數據類型。
???????? 如上面那個例子。 我們可以定義1個student 的結構體
???????? 可以看出,結構體里面只有屬性(c里面叫成員),而沒有方法的, 所以它描述事物沒有類那么全面, 但也有它的好處, 就是編譯程序的時候能以算法為核心..
?????????? 注意,結構體只是1個自定義的類型,而不是變量哦, 定義了1個新的結構體后,并沒有給它分配內存.,跟未實例化的類是差不多的。
????????? 我們可以寫個例子程序
?
??????? 輸出結果:
三,結構體的使用方法。
???? 上面那個例子,我們定義了1個Student 結構體類型的變量st, 并給他賦值.
???? 但是通常情況下我們還會定義1個指針,, 因為我們定義1個名字叫st 的student 結構體類型變量時, 系統就會給這個變量st分配內存, 分配多少內存呢? 起碼需要int sid(4字節)>, char[10] (10字節),int age(4字節),就是18byte啊, 實際上還不只這個數。
???????
????? 所以我們每次處理這個變量,或者作為參數傳遞時,對應帶著至少18 k內存。
????? 所以我們可以定義1個指向student 類型的指針, 這個指針指向1個結構體的第1個地址, 無論對應的結構體多么復雜龐大。這個指針只需要4字節(32位)或8字節(64位)。
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????? 輸出結果
?
注意上面的例子,
我們定義1個指向結構體變量的指針時pst時,
給結構體成員賦值有兩種方法:
?? st.sid = xxxx;
?? pst->sid = xxxx;
這兩種語句是等價的, 因為pst->sid 等價于 (*pst).sid 等價與 st.sid
所以 pst->sid 就是表示指針pst 所指向結構體變量中的sid這個成員。
注意事項:
???? 結構體變量之間不能加減乘除, 但是可以互相賦值
????
4.普通結構體變量和結構體指針變量作為函數參數傳遞的問題。
?? 如下面這個例子:
?
輸出結果:
其中我定義了1個Student的結構體 st, 并將它的地址傳入函數sv 和 pv.
其實也可以看出, 這兩個函數sv 和 pv的功能恰恰就如同 本文開始的java class Student 中的兩個方法 inputStuent 和 ShowStudent 啊..
?????? 在語言中,為了表示一些復雜的數據, 而普通的基本變量類型無法滿足要求。
?????? 例如要定義1個學生類型, 學生有3個屬性 sid, name, age
?????? 那么在面向對象語言里(例如java),我們可以寫1個類
??????
Class Student {int sid;String name;int age;void inputStudent(){} void showStudent(){} }? ? ? ?? 可以見到在類里面有屬性,有方法, 可以很好地表示了這個類型的結構。
???????? 而c語言不是面向對象語言, 折衷地,就可以使用結構體來表示復雜結構的類型。
二,什么是結構體
???????? 結構體是根據用戶實際需要自己定義的符合數據類型。
???????? 如上面那個例子。 我們可以定義1個student 的結構體
????????
struct Student{int sid;char name[10];int age;}; //分號不能省???????? 可以看出,結構體里面只有屬性(c里面叫成員),而沒有方法的, 所以它描述事物沒有類那么全面, 但也有它的好處, 就是編譯程序的時候能以算法為核心..
?????????? 注意,結構體只是1個自定義的類型,而不是變量哦, 定義了1個新的結構體后,并沒有給它分配內存.,跟未實例化的類是差不多的。
????????? 我們可以寫個例子程序
?
??????? 輸出結果:
三,結構體的使用方法。
???? 上面那個例子,我們定義了1個Student 結構體類型的變量st, 并給他賦值.
???? 但是通常情況下我們還會定義1個指針,, 因為我們定義1個名字叫st 的student 結構體類型變量時, 系統就會給這個變量st分配內存, 分配多少內存呢? 起碼需要int sid(4字節)>, char[10] (10字節),int age(4字節),就是18byte啊, 實際上還不只這個數。
???????
????? 所以我們每次處理這個變量,或者作為參數傳遞時,對應帶著至少18 k內存。
????? 所以我們可以定義1個指向student 類型的指針, 這個指針指向1個結構體的第1個地址, 無論對應的結構體多么復雜龐大。這個指針只需要4字節(32位)或8字節(64位)。
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????? 輸出結果
?
注意上面的例子,
我們定義1個指向結構體變量的指針時pst時,
給結構體成員賦值有兩種方法:
?? st.sid = xxxx;
?? pst->sid = xxxx;
這兩種語句是等價的, 因為pst->sid 等價于 (*pst).sid 等價與 st.sid
所以 pst->sid 就是表示指針pst 所指向結構體變量中的sid這個成員。
注意事項:
???? 結構體變量之間不能加減乘除, 但是可以互相賦值
????
4.普通結構體變量和結構體指針變量作為函數參數傳遞的問題。
?? 如下面這個例子:
?
輸出結果:
其中我定義了1個Student的結構體 st, 并將它的地址傳入函數sv 和 pv.
其實也可以看出, 這兩個函數sv 和 pv的功能恰恰就如同 本文開始的java class Student 中的兩個方法 inputStuent 和 ShowStudent 啊..
總結
以上是生活随笔為你收集整理的c语言结构体介绍及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle存储结构_文件
- 下一篇: Oracle 存储结构_表空间简介