C語言結構體

1 結構體

數組是相同類型元素的集合。

結構體可以由多種不同類型的數據類型組成的新的數據類型

2 結構體聲明

struct Student { 
    int age; 
    charchar *name;     
}; 

3 結構體變量的定義

1、先定義結構體,再定義變量

struct Student { 
    int age; 
    charchar *name; 
}; 
struct Student stu; 

2、定義結構體的同時定義變量

struct Student { 
    int age; 
    charchar *name; 
} stu; 

3、直接定義結構體變量

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 結構體的初始化

1、聲明變量的同時初始化

struct Student {  
    int age;  
    charchar *name;  
};  
struct Student stu = {22, "hello"};  

2、先聲明變量,再逐一初始化

struct Student stu;  
stu.age = 22;  
stu.name = "hello";  


3、定義結構體的同時進行變量定義和初始化 

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);
}

而這裏通過指針傳遞的話,指針要比結構體小的多,所以效率會高。

發佈了37 篇原創文章 · 獲贊 6 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章