假設有乙個函式:
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 定義結構體變數...