在c語言中,結構體(struct)指的是一種資料結構,是c語言中聚合資料型別(aggregate data type)的一類。我們在程式裡會建立很多變數,有時候我們需要用某個變數來描述乙個人,而乙個人身上的特點有很多,不止乙個,如果只用乙個特點來描述就顯得不那麼準確。所以我們要建立多個不同的變數來描述同乙個人;而把這多個變數放在一起,起乙個新名字就是結構體。
在宣告結構體時,必須列出它所包含的所有成員。這個列表包括每個成員的型別和名字。
struct student
stu;
這裡宣告了乙個型別為struct student的結構體,並且建立了乙個結構體變數stu,它包括三個成員:乙個字元型陣列,乙個字元型變數,乙個整形變數。
這裡的student和stu可以根據情況省略掉其中乙個。如果刪掉型別名,後續不能再次定義此型別的結構體,如果刪掉變數名則後續可以重新定義變數。
struct student
stu[20]
,*p;
這裡在建立變數時建立了乙個陣列,陣列的20個成員都是struct student型別的結構體,*p為可以指向該結構體型別的指標。
struct student1
stu;
struct student2
*p;
這裡宣告了兩個結構體型別,其成員列表完全相同,但是其本質上是兩個結構體,所以*p可以指向struct student2而不能指向struct student1;
struct student
;int
main()
;return0;
}
這裡建立了stu變數並進行初始化。也可以對任意成員重新賦值。
stu.number =
10;
結構體和陣列都是聚合資料型別,不同的是陣列存放的是相同的資料型別,而結構體存放的是不同的資料型別,那麼,這兩種型別是否可以存放各自的型別呢?答案是可以的,陣列可以存放陣列,也可以存放結構體,同時,結構體可以存放陣列,也可以存放其他結構體。如
struct student1
;struct student2
;
那麼,結構體是否能存放自身呢?
struct student1
;答案是不可以的,因為在開闢空間時就會發現問題,當系統為結構成員struct student1 stu開闢空間時,發現他是另乙個結構體,繼而會對該結構體開闢空間而該結構體裡又有結構體,陷入死迴圈,所以這是不成立的。
那如果我就是要乙個可以存放自身結構體的元素呢?
struct student1
;
我們可以在結構體裡定義乙個指向自身型別的指標變數,而指標在64位平台下大小都是4位元組,所以有效的避免了開闢空間的問題。
陣列可以通過指標和下標訪問元素,那結構體可以嗎?
事實上結構體可以通過指標訪問,但是不能通過下標訪問。
結構體訪問方式有兩種第一種直接通過變數名訪問。
struct student
;int
main()
;printf
("%s %c %d\n"
,stu.name,stu.***,stu.number)
;}
這裡用到了「.」操作符,先是結構體變數名然後「.」接著是成員名;就可以訪問對應元素。
第二種就是通過指標訪問。
struct student
*p;int
main()
; p =
&stu;
printf
("%s %c %d\n"
, p->name,p->***,p->number)
;}
這裡用到「->」操作符,用指標來訪問結構體成員。
結構體是標量,適用於其他標量可以使用的任何場合,因此把結構體作為引數傳遞給乙個函式是合法的,但這種做法往往並不適宜。因為結構體裡面往往包含多個成員,而我們知道函式傳參會發生值拷貝,如果該結構體成員過多,這樣的做法肯定會導致程式執行效率降低。所以正確的做法是指標傳遞。
struct student
;void
fun(
struct student *p)
intmain()
;fun
(&stu)
;return0;
}
通過這樣的方法就有效的避免了值拷貝問題。 C語言學習筆記 結構體
1 結構體定義 結構體是將不同型別的資料按照一定的功能需求進行整體封裝,封裝的資料型別與大小均可以由使用者指定。2 結構體宣告 宣告乙個結構體型別的一般形式為 struct 結構體名 例如 struct book 注意 結構體名 的命名規範是全部使用大寫字母。3 定義結構體變數 定義結構體型別變數有...
C語言學習筆記 結構體
struct stu 順帶宣告 在結構體宣告的最後的分號前加stu1,stu2這樣的變數名,不需要寫結構體的名字。利用結構體名來宣告變數 struct stu stu3 struct stu stu1,stu2,stu3 這樣的語句中struct stu就可以理解成變數宣告前的int,double等...
C語言學習筆記 結構體
結構體是一種資料型別,用 struct 關鍵字來修飾,定義乙個結構體可以這樣 123 45 struct teacher 如果用 typedef 修飾,就可以直接使用 teacher 123 4567 typedef struct teacher teacher teacher null 為結構體申...