欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言結(jié)構(gòu)體詳細(xì)圖解分析

 更新時間:2022年03月25日 10:27:21   作者:瑯時壹  
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結(jié)構(gòu)體

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

結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員是不同類型的變量。

為什么要有結(jié)構(gòu)體

比如說,描述一個學(xué)生時,需要有

  • 名字
  • 性別
  • 年齡
  • 身高

來一起描述,需要不同的變量,便有了結(jié)構(gòu)體類型來描述

結(jié)構(gòu)體的聲明

struct tag
{
	member-lest//成員列表
}variable-list;//變量列表

例如一個學(xué)生

struct stu
{
	char name[20];
	char sex[5];
	int age;
	int hight;
};//這里有沒有變量列表都可以

struct stu
{
	char name[20];
	char sex[5];
	int age;
	int hight;
}s2,s3,s4;//s2,s3,s4全局變量
struct stu s5;
int main()
{
	struct stu s1;//結(jié)構(gòu)體變量
}

特殊聲明

在聲明結(jié)構(gòu)體時候,可以不完全聲明

struct
{
	char c;
	int a;
	double a;
}sa;//匿名結(jié)構(gòu)體變量,必須在此處定義變量,否則以后不能使用
int main()
{
	return 0;
}

錯誤示范

編譯器認(rèn)為ps和&sa是兩種類型,這種寫法是錯誤的

數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)在內(nèi)存中存儲的結(jié)構(gòu)

關(guān)于列表

struct node
{
	int date;
	struct node next;
};
int main()
{
	return 0;
}

這樣無法判斷結(jié)構(gòu)體大小 只需在結(jié)構(gòu)體存放能找到下一個結(jié)構(gòu)體內(nèi)容的指針即可

struct node
{
	int date;
	struct node* next;
};
int main()
{
	return 0;
}

也可以這樣(重命名使用舉例)

typedef struct node
{
	int date;
	struct node* next;
}node;

int main()
{
	struct node n2 = { 0 };//2者都可以使用
	node n = { 0 };//盡量不對結(jié)構(gòu)體使用typedef
}

結(jié)構(gòu)體變量的定義和初始化

struct point
{
	int x;
	int y;
}p1;             //聲明類型同時定義變量p1
struct point p2;//定義結(jié)構(gòu)體變量p2


//初始化:定義變量的同時賦初值
struct point p3 = { 1,2 };

struct stu         //類型聲明
{
	char name[15];//名字
	int age;      //年齡
};
struct stu s = { "zhangsan",20 };//初始化

struct node
{
	int date;
	struct point p;
	struct node* next;
}n1 = { 10,{4,5},NULL };          //結(jié)構(gòu)體嵌套初始化

struct node n2 = { 20,{5,6},NULL };//結(jié)構(gòu)體嵌套初始化

結(jié)構(gòu)體大小計算

先來觀察下列代碼

#include <stdio.h>
int main()
{
	struct S1

{
	char c1;
	int i;
	char c2;
};
printf("%d\n", sizeof(struct S1));
//練習(xí)2
struct S2
{
	char c1;
	char c2;
	int i;
};
printf("%d\n", sizeof(struct S2));
//練習(xí)3
struct S3
{
	double d;
	char c;
	int i;
};
printf("%d\n", sizeof(struct S3));
//練習(xí)4-結(jié)構(gòu)體嵌套問題
struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
printf("%d\n", sizeof(struct S4));
return 0;
}

運(yùn)行結(jié)果

發(fā)現(xiàn)并不是數(shù)據(jù)類型大小的簡單相加

存在對齊

如何計算?
首先得掌握結(jié)構(gòu)體的對齊規(guī)則:
1. 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
2. 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。
對齊數(shù) = 編譯器默認(rèn)的一個對齊數(shù) 與 該成員大小的較小值。
VS中默認(rèn)的值為8
3. 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。
4. 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整
體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
為什么存在內(nèi)存對齊 ?
大部分的參考資料都是如是說的:
1. 平臺原因(移植原因):
不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特
定類型的數(shù)據(jù),否則拋出硬件異常。

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

相關(guān)文章

  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機(jī)制對普通指針進(jìn)行的一層封裝。這樣使得智能指針的行為動作像一個指針,本質(zhì)上卻是一個對象,這樣可以方便管理一個對象的生命周期
    2022-08-08
  • 使用Qt生成Word和PDF文檔的詳細(xì)教程

    使用Qt生成Word和PDF文檔的詳細(xì)教程

    Qt 是一個跨平臺的應(yīng)用程序開發(fā)框架,除了用于創(chuàng)建圖形界面應(yīng)用程序外,還可以用來生成 Word 和 PDF 文檔,本文將介紹如何使用 Qt 來生成Word和PDF文檔,以及相關(guān)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • 編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實例

    編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實例

    這篇文章主要介紹了編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實例,文中附錄了一個各種進(jìn)制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下
    2015-08-08
  • C語言各種操作符透徹理解下篇

    C語言各種操作符透徹理解下篇

    C?語言提供了豐富的操作符,除了上篇中的算術(shù)操作符,移位操作符,位操作符,賦值操作符外,還有單目操作符、關(guān)系操作符、邏輯操作符、條件操作符等等,讓我們通讀本篇來詳細(xì)了解吧
    2022-02-02
  • C++超詳細(xì)講解稀疏矩陣

    C++超詳細(xì)講解稀疏矩陣

    今天小編就為大家分享一篇關(guān)于C++稀疏矩陣的轉(zhuǎn)置思路并實現(xiàn)乘法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2022-05-05
  • c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    這篇文章主要介紹了c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • 簡明的C++函數(shù)指針學(xué)習(xí)教程

    簡明的C++函數(shù)指針學(xué)習(xí)教程

    這篇文章主要介紹了C++函數(shù)指針的學(xué)習(xí)教程,講到了函數(shù)指針的定義及把指針作為函數(shù)參數(shù)進(jìn)行傳遞的用法,需要的朋友可以參考下
    2016-04-04
  • 詳解C語言數(shù)組越界及其避免方法

    詳解C語言數(shù)組越界及其避免方法

    這篇文章主要介紹了詳解C語言數(shù)組越界及其避免方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Qt實現(xiàn)UDP通信的示例代碼

    Qt實現(xiàn)UDP通信的示例代碼

    UDP是一個輕量級、不可靠、面向數(shù)據(jù)報的、無連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會議等等。本文將通過Qt實現(xiàn)UDP通信,感興趣的可以了解一下
    2022-11-11
  • gcc中extra qualification錯誤的解決

    gcc中extra qualification錯誤的解決

    今天小編就為大家分享一篇gcc中extra qualification錯誤的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論