結構體是簡單資料型別的綜合
struct man
;struct man m =
;struct man m =
;
要訪問結構體成員,要使用.
操作符。
m.age;
結構在記憶體的大小是和結構成員最長的那個元素相關的
編譯器在編譯乙個結構的時候採用記憶體對齊模式
struct man
;//sizeof(struct man) = 8
定義乙個結構體的時候可以指定具體元素的位長
struct test
;
struct man m[10]
=,,}
;m[1]
.name;
乙個結構的成員還可以是另乙個結構型別
struct names
;struct man
;struct man m =,20
};m.name.fist;
//巢狀的使用
struct name a = b;
結構的賦值其實就是兩個結構記憶體的拷貝
memcpy
(&a,
&b,sizeof
(b))
;
如果結構體成員有指標元素,那麼就不能直接賦值,原因是會指向同一塊記憶體,使用free的話會造成沒有實際指向
struct man
;int
main()
struct man m;
struct man *p =
&m;(
*p).age =10;
//為操作簡單,加入了->操作符
p->age =
10;
乙個結構中可以有數組成員,也可以有指標成員
如果是指標成員結構體成員在初始化和賦值的時候就需要提前為指標成員分配記憶體
struct man
;
struct man
;
如果結構體有指標型別成員,同時結構體在堆中建立,那麼釋放堆中的結構體之前需要提前釋放結構體中的指標成員指向的記憶體
struct man
;struct man *s =
malloc
(sizeof
(struct man)*2
);s[0
].name =
malloc(10
*sizeof
(char))
; s[1]
.name =
malloc(10
*sizeof
(char))
;
struct student
;int
main()
;scanf
("%s"
, buf)
;int len =
strlen
(buf)
;//得到使用者輸入字串的長度
sp[i]
.name =
malloc
(len +1)
;sprintf
(sp[i]
.name,
"%s"
, buf);}
for(
int i =
0; i <
10; i++
)for
(int i =
0; i <
10; i++
)free
(sp)
;}
結構體作為函式引數,基本資料型別不會被改變,指標會被改變
func
(struct student st)
func
(st)
結構指標作為函式引數,所有資料可改變
func
(struct student *st)
func
(&st)
其根本原因是指向問題
如果乙個結構體變數做為函式的引數,效率極低。同時老的c編譯器都不支援傳遞結構變數,只支援傳遞結構指標
可以返回結構體,但一般不那麼做,原因是結構體返回太大
struct str *
getstr()
c語言 結構體學習筆記
一般形式 struct 結構體名 示例struct student 注意最後的分號2.1.先宣告結構體型別,再定義該型別的變數示例 struct student student1,student2 2.2.在宣告型別的同時定義變數 一般形式 struct 結構體名變數名表列 示例struct stu...
C 學習筆記(十二)結構體
結構體 struct 是很好的,之所以有結構體,才使得乙個單一變數可以儲存各種資料型別的相關資料。struct booksc 中的結構體挺特殊的,在struct的定義裡面還可以新增方法和屬性等 struct books public void display title console.writel...
C 學習筆記(六)結構體
結構體屬於使用者自定義的資料型別,允許使用者儲存不同的資料型別 通過結構體建立變數的方式有三種 struct 結構體名 變數名 struct 結構體名 變數名 定義結構體時順便建立變數 struct student stu1 struct關鍵字可省略 struct student stu2 stru...