C 語言結構體的使用方法

C 語言結構體使用

1. 結構體的聲明和定義

1.1 介紹

  • 我們知道數組是同種類型值的集合,而結構就是可以將不同類型的值放在一起。
  • 結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。
  • 結構的成員可以是標量、數組、指針,甚至是其他結構體。

如我們可以將一個學生的一些屬性放在一起

struct stu//定義一個結構體類型,就如int、char,struct stu是我們定義的結構體類型
{
    //成員變量
    char name[20];//名字
    int age;//歲數
    char id[20];//學號
};
int main()
{
    struct stu a;//定義一個struct stu類型的變量a,而對象a中就包含瞭名字,歲數,學號的屬性
}

1.2定義的幾種類型

類型1:

struct stu
{
    char name[20];
    int age;
};
int main()
{
    struct stu a;//定義局部變量a
}

類型2:

struct stu
{
    char name[20];
    int age;
}s1,s2;//定義全局變量s1,s2

2. 結構體初始化

代碼如下:

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    //初始化時,其實是和數組初始化一樣,用大括號,裡面放上初始化的值。若結構體裡面包含結構體,則大括號裡面 //在放一個大括號,裡面放內部結構體初始化的值
    
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
}

3. 結構體成員訪問

3.1 成員介紹

  • 結構變量的成員是通過點操作符(.)訪問的。點操作符接受兩個操作數,如:m.n(m為結構體變量,n為結構體中你想要訪問的成員變量)
  • 指向一個結構體的指針訪問指向變量的成員是通過操作符(->)訪問的。 如:m->n(m為指向一個結構體的指針,n為結構體中你想要訪問的成員變量),也可以(*m).n
struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    //法一
    printf("%s\n",a.name);
    printf("%d\n",a.age);
    printf("%.1f\n",a.b.height);//若訪問結構體中的結構體中的一個成員,先訪問到內部的結構體,再訪問內部結構體中的成員
    
    //法二
    struct stu* pa=&a;
    printf("%s\n",pa->name);
    printf("%d\n",pa->age);
    printf("%.1f\n",pa->b.height);
    
    //法三
    printf("%s\n",(*pa).name);
    printf("%d\n",(*pa).age);
    printf("%.1f\n",(*pa).b.height);
}

4. 結構體傳參

註意:

結構體傳參的時候,要傳結構體的地址更好

代碼如下:

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
void print1(struct stu p)
{
    printf("%s %d %s %.1f %s",p.name,p.age,p.id,p.b.height,p.b.name);
}
void print2(struct stu* pa)
{
    printf("%s %d %s %.1f %s",pa->name,pa->age,pa->id,pa->b.height,pa->b.name);
}
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    
    //寫一個函數打印a的內容
    
    print1(a);//結果為:bobo 18 2021520 15.8 free(正常打印)
    
    //再寫一個函數,通過傳a的地址打印a的內容
    
    print2(&a);//結果為:bobo 18 2021520 15.8 free(正常打印)
    
    return 0;
}

那麼傳值和傳址有什麼不同,哪個更好呢?(首選傳址

  • 傳參時,其實是對實參的一份拷貝,是會開辟一塊空間來存儲實參。傳值,是將整個實參拷貝過去,而傳地址,傳過去的隻是地址,傳參的效率更高一些。
  • 函數傳參的時候,參數是需要壓棧的。 如果傳遞一個結構體對象的時候,結構體過大,參數壓棧的的系統開銷比較大,所以會導致性能的下降。

那麼什麼是函數調用的參數壓棧呢?

棧:一種數據結構,是一種隻能在一端進行插入和刪除操作的特殊線性表

特點:先進的後出,後進的先出。(先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來))

壓棧:給棧裡存數據

  • 每一個函數的調用都會在內存的棧區上開辟一塊空間,並且數據都會如壓棧一樣一個一個的存放進棧區,如果數據比較多、大時,參數壓棧就比較吃力,所以導致性能就會下降。

到此這篇關於C 語言結構體的使用基礎版的文章就介紹到這瞭,更多相關C 語言結構體的使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: