最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言結(jié)構(gòu)體嵌套與對齊超詳細(xì)講解

 更新時間:2022年12月26日 15:40:58   作者:編程遠(yuǎn)泊  
這篇文章主要介紹了C語言結(jié)構(gòu)體嵌套與對齊,C語言中結(jié)構(gòu)體是一種構(gòu)造類型,和數(shù)組、基本數(shù)據(jù)類型一樣,可以定義指向該種類型的指針。結(jié)構(gòu)體指針的定義類似其他基本數(shù)據(jù)類型的定義

嵌套結(jié)構(gòu)體

格式:
typedef struct 結(jié)構(gòu)體名 {
struct 結(jié)構(gòu)體名1 結(jié)構(gòu)體變量名1;
struct 結(jié)構(gòu)體名2 *結(jié)構(gòu)體指針變量名1;
}結(jié)構(gòu)體別名_t;

定義結(jié)構(gòu)體普通的變量,訪問結(jié)構(gòu)體中的成員:

結(jié)構(gòu)體別名_t 普通結(jié)構(gòu)體變量名;

普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體變量名1.成員名;
普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體指針變量名1->成員名;

定義結(jié)構(gòu)體指針變量,訪問結(jié)構(gòu)體中的成員

結(jié)構(gòu)體別名_t *結(jié)構(gòu)體指針變量名;

結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體變量名1.成員名;
結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體指針變量名1->成員名;

總結(jié),訪問結(jié)構(gòu)體中的成員時,具體使用.還是->,需要看當(dāng)前的結(jié)構(gòu)體變量的類型。

測試用例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Person
{
    char *name;
    int age;
    char sex;
} Person_t;
typedef struct Student
{
    Person_t per;
    int score;
} Student_t;
typedef struct Teacher
{
    Person_t *per_p;
    int salary;
} Teacher_t;
int main(int argc, const char *argv[])
{
    /*your code*/
    // 1. 定義結(jié)構(gòu)體類型的變量
    Student_t stu1;
    // 2. 初始化結(jié)構(gòu)體中的成員
    stu1.per.name = (char *)malloc(sizeof(char) * 20);
    if (stu1.per.name == NULL)
    {
        printf("malloc failed\n");
        return -1;
    }
    strcpy(stu1.per.name, "zhoukai");
    stu1.per.age = 18;
    stu1.per.sex = 'M';
    stu1.score = 99;
    printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\
        stu1.per.name, stu1.per.age, stu1.per.sex, stu1.score);
    // 使用Teacher_t定義結(jié)構(gòu)體指針類型的變量,使用malloc分配空間
    Teacher_t *t=(Teacher_t *)malloc(sizeof(Teacher_t));
    if(NULL==t)printf("malloc memory filed!\n");
    // 對Teacher_t類型中的per_p成員,使用malloc分配空間,
    t->per_p =(Person_t *)malloc(sizeof(Person_t));
    if(NULL==t->per_p)
    {
        printf("malloc memory filed!\n");
        return -1;
    }
    // 對Person_t中的name成員,使用malloc分配空間。
    t->per_p->name=(char *)malloc(sizeof(char)*20);
    if(NULL==t->per_p->name)
    {
        printf("malloc memory filed!\n");
        return -1;
    }
    // 分配堆區(qū)空間時,從外向內(nèi)進(jìn)行分配;釋放空間時,從內(nèi)向外分配空間。
    strcpy(t->per_p->name,"yao");
    t->per_p->age=10;
    t->per_p->sex='M';
    t->salary=100000;
    printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\
        t->per_p->name,t->per_p->age, t->per_p->sex,t->salary);
    //釋放空間
    free(t->per_p->name);
    t->per_p->name=NULL;
    free(t->per_p);
    t->per_p=NULL;
    free(t);
    t=NULL;
    return 0;
}

圖解:

結(jié)構(gòu)體內(nèi)存對齊

32位的操作系統(tǒng)

結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,long int, long long int, float, double 類型,
此成員的地址是4的整數(shù)倍;

編譯成32位的可執(zhí)行程序:

gcc ***.c -m32

測試:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
typedef struct{
    char name[20];
    char sex;
    char age;
}A_t;
//2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
typedef struct{
    char name[20];
    short age;
    char sex;
            // 保留一個字節(jié)
}B_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一個字節(jié)
    short age;
}C_t;
//3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
typedef struct{
    char name[20];
    char sex;
            // 保留三個字節(jié)
    int age;
}D_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一個字節(jié)
    short score;
    int age;
}E_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一個字節(jié)
    short score;
    long long int age;
}F_t;
typedef struct{
    char *name;
    char sex;   
            // 保留一個字節(jié)
    short score;
    long long int age;
}G_t;
typedef struct{
    char *name;
    char sex;   
            // 保留一個字節(jié)(不同類型的在同一行,不同的那個從后往前補?。?!)
    short score;
    char salary; 
    long long int age;
}H_t;
int main(int argc, const char *argv[])
{
    /*your code*/
    printf("A_t type size=%d\n",sizeof(A_t));//22
    printf("B_t type size=%d\n",sizeof(B_t));//24
    printf("C_t type size=%d\n",sizeof(C_t));//24
    printf("D_t type size=%d\n",sizeof(D_t));//28
    printf("E_t type size=%d\n",sizeof(E_t));//28
    printf("F_t type size=%d\n",sizeof(F_t));//32
    printf("G_t type size=%d\n",sizeof(G_t));//16
    printf("H_t type size=%d\n",sizeof(H_t));//20
    printf("-----------G_t中成員的地址-----------\n");
    G_t g;
    printf("G_t成員 char *name 的地址%p\n",g.name);
    printf("G_t成員 char sex 的地址%p\n",&g.sex);
    printf("G_t成員 short score 的地址%p\n",&g.score);
    printf("G_t成員 long long int age 的地址%p\n",&g.age);
    printf("-----------H_t中成員的地址-----------\n");
    H_t h;
    printf("H_t成員 char *name 的地址%p\n",h.name);
    printf("H_t成員 char sex 的地址%p\n",&h.sex);
    printf("H_t成員 short score 的地址%p\n",&h.score);
    printf("H_t成員 char salary 的地址%p\n",&h.salary);
    printf("H_t成員 long long int age 的地址%p\n",&h.age);
    return 0;
}

64位的操作系統(tǒng)

結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員最大的成員只占8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為8的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
8的整數(shù)倍;

結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
gcc ***.c

到此這篇關(guān)于C語言結(jié)構(gòu)體嵌套與對齊超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法

    Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法

    這篇文章主要介紹了Qt中簡單的按鈕槽函數(shù)傳遞參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言經(jīng)典指針筆試題詳解

    C語言經(jīng)典指針筆試題詳解

    今天博主來講解4道經(jīng)典的指針筆試題,很多朋友沒有深刻理解函數(shù)傳參知識都會在這些題目上出錯,下面話不多說,我們開始
    2021-10-10
  • C/C++實操True and false詳解

    C/C++實操True and false詳解

    這篇文章主要給大家介紹了關(guān)于Python中常用的數(shù)據(jù)類型bool(布爾)類型的兩個值:True和False的相關(guān)資料,通過示例代碼給大家進(jìn)行了解惑,讓對這兩個值有所疑惑的朋友們能有起到一定的幫助,需要的朋友下面來一起看看吧。
    2021-09-09
  • 淺析C++中的函數(shù)與指針

    淺析C++中的函數(shù)與指針

    這篇文章主要介紹了淺析C++中的函數(shù)與指針,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • 數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實例代碼

    數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實例代碼

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入
    2022-02-02
  • C語言近萬字為你講透棧和隊列

    C語言近萬字為你講透棧和隊列

    對于線性表,我們可能要執(zhí)行下列操作:訪問表的第k個結(jié)點、在k這個結(jié)點之前或者之后插入一個新結(jié)點,抑或是刪除第k個結(jié)點等等操作,其中我們會遇到值對第一個或者最后一個結(jié)點插入、刪除、和訪問值的線性表,我們給它們以特殊的名稱:棧、隊列、雙端隊列
    2022-05-05
  • 淺談C++ 緩沖區(qū)(buffer)的使用

    淺談C++ 緩沖區(qū)(buffer)的使用

    緩沖區(qū)是用來存放流中的數(shù)據(jù),本文詳細(xì)的介紹了C++ 緩沖區(qū)(buffer)的使用,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    這篇文章主要介紹了C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符,文章基于C語言展開對主題的詳細(xì)介紹,下文內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • C++使用MIDI庫實現(xiàn)演奏晴天

    C++使用MIDI庫實現(xiàn)演奏晴天

    這篇文章主要為大家詳細(xì)介紹了C++如何使用MIDI庫實現(xiàn)演奏晴天歌曲,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2025-02-02

最新評論

比如县| 聊城市| 贺州市| 浠水县| 桂阳县| 霍城县| 内黄县| 蕉岭县| 广汉市| 东城区| 栾城县| 东明县| 宜丰县| 科技| 鸡泽县| 阿拉善左旗| 三都| 河东区| 文水县| 通道| 深泽县| 定州市| 图们市| 安达市| 乌苏市| 北碚区| 志丹县| 大港区| 眉山市| 奉节县| 蓝山县| 凤城市| 思茅市| 岐山县| 仲巴县| 安宁市| 英山县| 棋牌| 沧源| 勐海县| 商丘市|