1 結構體
數組是相同類型元素的集合。
結構體可以由多種不同類型的數據類型組成的新的數據類型
2 結構體聲明
struct Student {
int age;
charchar *name;
};
3 結構體變量的定義
struct Student {
int age;
charchar *name;
};
struct Student stu;
struct Student {
int age;
charchar *name;
} stu;
struct {
int age;
charchar *name;
} stu;
4 結構體成員
1 成員類型
任何變量類型都可以作爲結構體成員。
struct List{
int a[20];
float b;
long *c;
struct List *d; //struct List d是非法的
} ;
2 成員訪問
結構體成員通過(.)操作符訪問。
struct List list;
list.a;
list.b;
list.d.c; ///操作符的優先級是從左到右
3 指針訪問
void fun(struct List *p); //指針需要進行間接訪問
(*p).a; //因爲(.)操作符的優先級高於(*),所以要用括號
// ->操作符
p->a;
p->d.a;
4 不完整聲明
struct B; //不完整聲明
struct A{
struct B *b;
};
struct B{
struct A *a;
};
A結構體中有B結構體,所以A需要B的不完整聲明。
5 結構體的初始化
struct Student {
int age;
charchar *name;
};
struct Student stu = {22, "hello"};
struct Student stu;
stu.age = 22;
stu.name = "hello";
struct Student {
int age;
charchar *name;
} stu = {22, "hello"};
4、非順序初始化struct Student stu = {.name = "hello", .age = 22};
6 參數傳遞
typedef struct{
int a;
float b;
float c;
} A;
void printA(A a){
printf("%d",a.a);
}
int main(){
A a = {1};
printA(a);
}
這樣雖然正確,但是效率很低,C語言傳值調用,會拷貝整一份的結構體,上例中總共要拷貝12個字節。
typedef struct{
int a;
float b;
float c;
} A;
void printA(A *a){
printf("%d",a->a);
}
int main(){
A a = {1};
printA(&a);
}
而這裏通過指針傳遞的話,指針要比結構體小的多,所以效率會高。