Struct結構體

在實際的編程過程當中,咱們每每還須要一組類型不一樣的數據,例如對於學生信息登記表,姓名爲字符串,學號爲整數,年齡爲整數,所在的學習小組爲字符,成績爲小數,由於數據類型不一樣,顯然不能用一個數組來存放。html

在C語言中,可使用結構體(Struct)來存放一組不一樣類型的數據。編程

 

結構體定義

struct 結構體名{
    結構體須要的變量;
}

 

結構體是一種集合,它裏面包含了多個變量或數組,它們的類型能夠相同,也能夠不一樣,每一個這樣的變量或數組都稱爲結構體的成員(Member)。數組

簡單理解,結構體就是一種自定義的數據類型,能夠認爲它跟int char等數據類型徹底一致。區別就在於結構體是基本數據機構的集合,是由建立者自定義的,建立者擁有絕對的自主權。函數

結構體的優點就在於很方便地進行多數據管理。學習

 

示例

#include <stdio.h>
#include <string.h>
struct student{
    char name[16];
    int age;
    int grade;
};
struct teacher{
    char *name;//危險
    int age;
    int level;//職稱
};
int main()
{
    struct student ZhangSan;
    struct teacher WangEr;
    ZhangSan.age = 16;
    WangEr.age = 50;
    WangEr.name = "WangEr";//危險
    strcpy(ZhangSan.name, "ZhangSan");
    // ZhangSan.name = "ZhangSan";//不能編譯經過
    return 0;
}

 

 

C++中的結構體

在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具備狀態(屬性)和行爲,狀態保存在成員變量中,行爲經過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行爲。在C++中,考慮到C語言到C++語言過渡的連續性,對結構體進行了擴展,C++的結構體能夠包含函數,這樣,C++的結構體也具備類的功能,與class不一樣的是,結構體包含的函數默認爲public,而不是private。spa

函數引入

#include <stdio.h>
#include <string.h>
struct student{
    char name[16];
    int age;
    int grade;
    void say()
    {
        printf("I am %s\n", name);
    }
};
struct teacher{
    char *name;//危險
    int age;
    int level;//職稱
};
int main()
{
    struct student ZhangSan;
    struct teacher WangEr;
    strcpy(ZhangSan.name, "ZhangSan");
    ZhangSan.say();
    return 0;
}

 

自動初始化結構體

沒有初始化

#include <stdio.h>
#include <string.h>
struct student{
    char name[16];
    int age;
    int grade;
    void say()
    {
        printf("I am %s\n", name);
    }
};
struct teacher{
    char *name;//危險
    int age;
    int level;//職稱
    void say()
    {
        printf("I am %s\n", name);
    }
};
int main()
{
    struct student ZhangSan;
    struct teacher WangEr;
    ZhangSan.say();//I am @@, 內存裏面是什麼就輸出什麼
    strcpy(ZhangSan.name, "ZhangSan");
    ZhangSan.say();//I am ZhangSan
    return 0;
}

 

 

 

初始化

#include <stdio.h>
#include <string.h>
struct student{
    char name[16];
    int age;
    int grade;
    student()
    {
        strcpy(name, "Student");
    }
    void say()
    {
        printf("I am %s\n", name);
    }
};
struct teacher{
    char *name;//危險
    int age;
    int level;//職稱
    void say()
    {
        printf("I am %s\n", name);
    }
};
int main()
{
    struct student ZhangSan;
    struct teacher WangEr;
    ZhangSan.say();
    strcpy(ZhangSan.name, "ZhangSan");
    ZhangSan.say();
    return 0;
}

 

 

結構體大小與內存對齊

結構體sizeof的結果每每都比聲明的變量總長度要大。.net

  1. 數據成員對齊規則:結構(struct或聯合union)的數據成員,第一個數據成員放在offset爲0的地方,之後每一個數據成員存儲的起始位置要從該成員大小的整數倍開始(好比int在32位機爲4字節,則要從4的整數倍地址開始存儲)。設計

  2. 結構體做爲成員:若是一個結構裏有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a裏存有struct b,b裏有char,int,double等元素,那b應該從8的整數倍開始存儲。)code

  3. 收尾工做:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。htm

 

建議閱讀

相關文章
相關標籤/搜索