C語言-數據結構-結構體


一、結構體的定義

數組(Array)是一組具有相同類型的數據的集合。但在實際的編程過程中,我們往往還需要一組類型不同的數據,例如對於學生信息登記表,姓名為字符串,學號為整數,年齡為整數,所在的學習小組為字符,成績為小數,因為數據類型不同,顯然不能用一個數組來存放。

結構體(Struct)可以來存放一組不同類型的數據。其是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。

結構體的定義形式為:

struct 結構體名{
    結構體所包含的變量或數組
};

例如:

struct stu{
    char *name;  //姓名
    int num;  //學號
    int age;  //年齡
    char group;  //所在學習小組
};

定義結構體變量:

struct stu stu1,stu2;

 或者在定義結構體的同時定義變量:

struct stu{
    char *name;  //姓名
    int num;  //學號
    int age;  //年齡
    char group;  //所在學習小組
}stu1,stu2;

 常用的是利用typedefstruct stu取別名:

typedef struct stu{
    char *name;  //姓名
    int num;  //學號
    int age;  //年齡
    char group;  //所在學習小組
}student;
student stu1, stu2;

給結構體變量賦值:

    stu1.name = "Tom";
    stu1.num = 12;
    stu1.age = 18;
    stu1.group = 'A';
    stu1.score = 136.5;

二、結構體數組的定義

//賦值
struct
stu stu1[5]; //或student stu1[5];
//賦值
class[5] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }

結構體數組的使用,例如,

獲取 Wang ming 的成績:stu1[4].score; 

修改 Li ping 的學習小組:class[0].group = 'B';

三、結構體指針

當一個指針變量指向結構體時,我們就稱它為結構體指針。C語言結構體指針的定義形式一般為:

struct 結構體名 *變量名;

注意,結構體變量名數組名不同,數組名在表達式中會被轉換為數組指針,而結構體變量名不會,無論在任何表達式中它表示的都是整個集合本身,要想取得結構體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫作:

struct stu *pstu = &stu1;

獲取結構體成員:.的優先級高於*(*pointer)兩邊的括號不能少。

(*pointer).memberName

或:->是一個新的運算符,可以通過結構體指針直接取得結構體成員;

pointer->memberName

結構體指針作為函數參數:

結構體變量名代表的是整個集合本身,作為函數參數時傳遞的整個集合,也就是所有成員,而不是像數組一樣被編譯器轉換成一個指針。如果結構體成員較多,尤其是成員為數組時,傳送的時間和空間開銷會很大,影響程序的運行效率。所以最好的辦法就是使用結構體指針,這時由實參傳向形參的只是一個地址,非常快速。

注意:結構體數組指針的使用(結構體數組變量名前不需要加&

#include <stdio.h>

struct stu{
    char *name;  //姓名
    int num;  //學號
    int age;  //年齡
    char group;  //所在小組
    float score;  //成績
}stus[] = {
    {"Zhou ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"Liu fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
}, *ps;

int main(){
    //求數組長度
    int len = sizeof(stus) / sizeof(struct stu);
    printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
    for(ps=stus; ps<stus+len; ps++){
        printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
    }

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM