C語言 結構體

2021-09-10 21:33:02 字數 3638 閱讀 9490

假設有乙個函式:

void getstudentprofile(const char* name,int age,int height,int weight,const char *hobby,const char* good,const char* school){}

每次呼叫時都要傳遞姓名、年齡、身高、體重、愛好、特長、學校名稱等資訊。呼叫時傳值都很麻煩。在c語言裡,我們可以用結構體包含這些資料,在呼叫時,直接傳遞結構體就可以了,如這樣:

void

info

(struct student stu)

除了可以把整批資料封裝在結構體中傳遞外,另一好處是修改結構體時,如增加乙個成員,不需要修改使用它的函式。不但讓**更好閱讀,還可以更好地應對變化 。

注意:結構體變數是結構本身的名字,而陣列變數則是乙個指標,另外在結構體裡不能有方法

結構體(struct,struct是structured data type結構化資料型別的縮寫)。結構體可以把不同型別的資料寫在一起,封裝成乙個新的大資料型別。結構體成員的型別可以c語言支援的所有型別,包括結構體、列舉等。

定義結構體時,結構體只是乙個模板,告知計算機資料型別有哪些,計算機並不會分配任何記憶體空間。只有在定義結構體變數時,計算機才會分配記憶體存放結構體例項。

結構體與陣列相似,除了以下兩點:

結構體的大小固定;

結構體中的資料都有名字。

strcut 結構體名

;

定義student結構體,把姓名、年齡、身高、體重、愛好、特長、學校名稱等資訊封裝在裡面:

struct student

;

struct classone grp;

};

typedef

struct

employee;

typedef

struct node bintnode;

typedef定義結構體別名,並使用別名定義結構體變數,如:

typedef

struct student heighschoolstudent;

heighschoolstudent stu1 =

;

struct student stu =

;

巢狀定義的結構體初始化:

struct classone class1 =

};

巢狀定義的結構還可以這樣初始化(以下主要展示classone結構體成員stu的初始化):

struct student stu1 =

;struct student stu2 =

;struct student stus=

;struct classone class1 =

};

struct student stu1 =

;

使用"."點運算子讀取結構體的字段值。結構體只能按名字訪問,不可以像陣列那樣使用下標的形式來讀取,如:

stu.name
示例:

student.h

struct student

;void

info

(struct student stu)

;

student.c

#include

#include

"student.h"

void

info

(struct student stu)

test.c:

#include

#include

"student.h"

intmain()

;info

(stu)

;return0;

}

編譯並執行:

~$ gcc student.c test.c -o stu

~$ .

/stu

hello,i am tom,

28 years old.i come from zhungsun university

在c語言中,所有賦值都會複製資料。如果只想複製資料的引用,那應該賦指標,因為只有把變數在儲存器中的位置告訴函式,函式才能更新儲存在**的資料 。

當把乙個結構體變數賦值給另乙個結構體變數時,計算機會建立乙個全新的結構體副本,也就是說計算機需要再分配一塊儲存空間,大小和原來一樣,然後把每個欄位都複製過去,如:

strcut student stu2 = stu;
傳遞結構體指標的demo:

student.h

typedef

struct studentstudent;

struct classone grp;};

void

info

(struct classone * clas)

;//形參是指標型別

student.c

#include

#include

"student.h"

void

info

(struct classone *clas)

test.c

#include

#include

"student.h"

intmain()

;struct student stu2 =

;struct student stus=

;struct classone class1 =};

info

(&class1)

;//傳遞結構體變數的位址

return0;

}

編譯並執行:

~

/desktop/myc$ gcc student.c test.c -o clas2

~/desktop/myc$ .

/clas2

hello,i am tom,

28 years old.i come from zhungsun university

,i am group group 1

,there are 12 students

如果想讓函式更新結構體變數,就應該傳遞結構體的位址或指標,否則只是將資料的副本複製給了函式。

C語言結構體

1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...

C語言 結構體

宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...

c語言 結構體

1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...