女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解C/C++結構體、聯合體和枚舉的區別與內存對齊

冬至子 ? 來源:AI讓生活更美好 ? 作者:Andy ? 2023-06-08 14:38 ? 次閱讀

C語言中構造類型一共有4種,它們分別是數組、結構體(struct)、共用體(union)、枚舉類型(enum)。

圖片

一、結構體類型

1、什么是結構體

在C語言中,結構體指的是一種數據結構,是C語言中聚合數據類型的一類。結構體可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員,且這些成員可以為不同的類型,成員一般用名字訪問。也就是說,結構體是由多種原宿所構成的數據結構。

2、定義結構體類型

struct 結構體

{

任意類型 任意變量;

任意類型 任意變量;

……

};

注意:這不是定義變量,而是自定義一種類型而已。如:

struct student
{
char name[10];//學生姓名
int height;//學生身高
bool sex;//學生性別 假設0表示女,1表示男。
};

3、 定義結構體變量

類型定義好以后,則可以定義該類型的變量。

?定義結構體變量:

struct student a,b;// struct可以省略。
可以在定義結構體變量的時候賦值。
如student a={”liudehua”,172,1},b={“lixiaolong”,172,1};

?也可以在定義結構體變量以后賦值,但注意不能再用{}。如:

student a,b;
a={”liudehua”,172,1},b={“lixiaolong”,172,1};//這是錯誤的。

?而應該是:

strcpy(a.name,”liudehua”);
a.height=172;
a.sex=1;

?可以在定義結構體類型的時候同時定義結構體變量并賦值。

struct student
{
  char name[10];//學生姓名
  int height;//學生身高
  bool sex;//學生性別 假設0表示女,1表示男。
} a={”liudehua”,172,1},b={“aolong”,172,1};

4.訪問結構體

訪問結構體成員要用直接成員運算符“.”或間接成員運算符“->”。

#include < iostream >
struct student
{
    char name[10];//學生姓名
    int height;//學生身高
    bool sex;//學生性別 假設0表示女,1表示男。
}a={"liudehua",182,1},b={"aolong",188,1};


int main()
{
    struct student*  x;
    x=&a;
    std::cout<

對于結構體變量,訪問其中的成員采取“結構體變量 . 成員”的形式;而對于結構體指針,訪問它所指向的結構體變量中的成員,則采取“結構體指針->成員”形式。

二、聯合體類型

1、什么是聯合體

聯合體也是一種自定義的復合類型,它可以包含多個不同類型的變量。這些變量在內存當中共用一段空間。這段空間的size就是各變量中size最大的那個變量。

2、定義聯合體類型

union myunion
{
  int num1;
  double num2;
  float num3;
};

定義了一個聯合體類型myunion。

myunion a,b;//定義了兩個myunion型變量。

也可以在定義聯合體類型的時候定義聯合體變量。如:

union myunion
{
  int num1;
  double num2;
  float num3;
}a,b;

a占用的空間有多大呢?

Sizeof(a)結果即為8,即myunion占用8個字節,和double型變量相同。

注意:任一時刻,只能訪問結構體里面的一個變量。

a.num1=2;
a.num2=3.154;
myunion *p;
p=&a;
p- >num3=5.6;

3、聯合體的使用

C++的聯合體(Union)與結構體相似,但它們的區別在于聯合體中只能同時存儲一個成員的值。這些成員共享同一個物理存儲空間,也就是說,一個聯合體的大小,等于它最大的成員變量所占據的空間。下面是一個示例代碼:

#include < iostream >
using namespace std;
??
union Person {
   int age;
   float height;
   char name[50];
};


int main() {
   union Person p1;
   p1.age = 30;
   cout < < "Age: " < < p1.age < < endl;

   p1.height = 1.85;
   cout < < "Height: " < < p1.height < < endl;


   strcpy(p1.name, "John Doe");
   cout < < "Name: " < < p1.name < < endl;

   return 0;
}

在這個例子中,我們定義了一個名為“Person”的聯合體,包含三個不同數據類型的成員變量:整數、浮點數和字符數組。在main函數中,我們可以看到如何使用聯合體。在第一次賦值時,我們將age設置為30并輸出,然后我們將height設置為1.85并輸出,此時前一個賦值的值被覆蓋了。在最后一部分,我們使用strcpy函數將字符串賦給name成員變量并輸出。

需要注意的是,在實際應用聯合體時,必須小心使用,因為一個成員變量的更改會影響所有其他成員變量。同時,由于聯合體需要共享內存,因此必須確保聯合體的大小能夠容納最大。

三、枚舉類型

1、什么是枚舉類型

枚舉類型是一種數據類型,它通常用來定義一個數字常量集合。在枚舉類型中,每個常量都有一個唯一的名稱和對應的數值。

2、枚舉類型的定義

枚舉類型也是一種自定義的復合類型。不過,枚舉類型中的成員都是常量。如

enum color
{
  red,
  green,
  blue,
  white,
  black
}

枚舉類型中的成員默認值為從0開始,依次序遞增。此時red==1,green為2,blue為3,white為4,black為5.

也可以改變起默認值。如

enum color
{
  red=1,
  green=3,
  blue=5,
  white,
  black
};

沒有初始化的枚舉類型成員的值將在它前面的成員基礎上遞增。所以,white的值為6,而black的值為7。

3、定義枚舉變量

color a1,a2

4、給枚舉變量賦值:

a1=red;
a2=blue;
cout

雖然枚舉常量的值整數,但是不能直接將整數值賦給枚舉變量。如

a1=1;//這是不對的。因為類型不匹配。一個是整型,一個是枚舉類型。
a1=(color)1;//正確

枚舉變量的size是一個整數的大小。

5、枚舉的使用

在C++中,枚舉類型可以用來定義一組常量。枚舉為程序員提供了一種方便的方式去定義一些有意義的名稱,而不是硬編碼數字,這樣代碼更易于理解和維護。下面是一個基本的枚舉示例:

#include < iostream >
using namespace std;




enum Weekday {
   Monday = 1,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday,
   Sunday
};




int main() {
   Weekday today;
   today = Tuesday;

   if(today == Sunday){
      cout< "Today is holiday!"<

在以上代碼中,我們定義了一個Weekday枚舉類型,將每個工作日映射到一個整數值上。默認情況下,第一個成員的值被設置為0,接著逐一自增,但我們可以使用顯式賦值來覆蓋它們。

在main函數中,我們聲明了一個名為today的變量,并且將其設置為Tuesday,通過if-else語句檢查是否為周日,然后輸出結果。需要注意的是,枚舉值可以與整數進行比較和賦值,因為每個成員都會被映射到一個整數值。

四、內存對齊與內存大小

1、內存對齊

在C語言中,內存對齊可以優化程序的性能,而結構體是需要進行內存對齊處理的數據類型。結構體的大小通常不僅取決于其中成員所占用的空間大小,還取決于操作系統和編譯器對于內存對齊方式的處理。

具體地說,內存對齊方式是為了符合硬件平臺訪問內存數據的要求,并以此提高代碼的執行效率。一般地,對于基本類型(如int、char、float等),系統通常會按照它們自身所占用的字節大小來進行內存分配,并確保各個變量在內存中的地址都是偶數或是四的倍數(這里假設系統采用的是32位架構)。

但如果結構體中的成員變量總大小不是4的倍數,則在結構體中填充一些無用的字節使得結構體字節數是4的倍數。

2、結構體大小

舉例說明,假設有以下的結構體:

struct S1 
{
    char c1;   // 1 byte
    int i;    // 4 bytes
    char c2;  // 1 bytes
};
int main()
{
    std::cout< sizeof (S1)<

圖片

內存對齊示意圖

它們總共占用的空間不是6字節(1+4+1),因為當前CPU硬件平臺一次最小訪問單位是4字節,所以編譯器會自動進行內存補齊,使得每個成員的地址都是4的倍數,結構體的實際大小可能會是12字節(4字節對齊)或是8字節(1字節對齊)。所以,具體的內存大小可能會因編譯器和硬件平臺的不同而異,并且有些編譯器可以通過一些指令來控制內存對齊方式以提高程序效率。

對于這中浪費內存的情況,作為程序員,我們在定義數據結構的時候完全可以避免。如下面:

struct S2 
{
    int i;    // 4 bytes
    char c1;   // 1 byte
    char c2;  // 1 bytes
};
int main()
{
    std::cout< sizeof (S2)<

**通過改變結構體里面變量的順序,避免內存對齊帶來的空間浪費。內存大小變為了8,內存節省了4個字節大小。

**

3、聯合體大小

C語言聯合體(union)的內存大小取決于其中最大成員的大小。因為聯合體內所有成員共用同一塊內存區域,因此聯合體的大小必須足夠容納所有成員中最大的那個。

舉個例子,如果我們有一個聯合體定義如下:

union Example 
{
    int x;
    char c;
    double d;
};

那么這個聯合體的大小就是8個字節。因為這三個成員中最大的是double類型,占用8個字節,其他成員對齊到8個字節,所以整個聯合體大小是8個字節。

需要注意的是,聯合體的成員必須是同一種類型或者大小相同,這是因為它們會共用同一個內存區域。如果不同類型的成員共存,可能會導致數據覆蓋或者讀取數據時出現未定義的行為。所以在使用聯合體時要特別小心,確保成員的類型和大小相同。

4、枚舉類型大小

在C語言中,枚舉類型(Enum)是一種自定義類型,用于表示有限個數的常量。在內存中,枚舉類型通常被存儲為整數類型,其大小與int類型相同,即通常為4個字節或8個字節(取決于系統架構)。

當定義枚舉變量時,該變量的值由枚舉列表中對應常量的整數值來決定。在下面這個例子中,我們創建了一個Color枚舉類型,其中包含三個常量紅色、綠色和藍色,它們分別賦予值0、1和2。而變量c則被定義為Color類型并初始化為紅色。

#include< stdio.h >
enum Color {
    RED,
    GREEN,
    BLUE
};


int main() {
    enum Color c = RED;
    printf("Sizeof enum: %d\\n", sizeof(enum Color));  //輸出為4或8字節
    return 0;
}

需要注意的是,枚舉類型在內存大小上可能會因為編譯器實現和程序運行的機器體系結構所影響。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140329
  • 編譯器
    +關注

    關注

    1

    文章

    1655

    瀏覽量

    49887
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7223
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C語言中結構聯合體的深度解析:內存布局與應用場景

    = \'A\' + i%26; } } ? // 測試結果: // struct耗時:12ms(內存連續訪問優勢) // union耗時:8ms(避免多次內存分配) 結語 結構
    發表于 04-08 09:18

    430編程C語言常識(IAR)之結構聯合體

      結構聯合體C語言的常見數據類型,可對C的基本數據類型進行組合使之能表示復雜的數據結構
    發表于 11-22 15:43

    DLL導入結構 聯合體

    DLL函數參數中,有結構聯合體結構中使用聯合體,這種方式的函數怎么使用LABVIEW導入
    發表于 09-06 10:32

    如何定義了這個聯合體

    我先定義一個聯合體數據類型,然后接著定義了一些聯合體變量,定義聯合體部分如下:我在sys_config.c文件中定義如下聯合體數據類型和變量
    發表于 07-12 04:28

    為什么位域結構聯合體一起使用?

    /*本例程是C語言的位域操作示例這里為什么位域結構聯合體一起使用?-->因為這樣定義后,即可以單獨使用標志位 也可同時使用整個字節數據主要應用:單片機
    發表于 07-14 06:23

    結構聯合體區別到底在哪里

    在單片機軟件編程中,結構枚舉類型都很常用到,聯合體相對來用的就比較少。那么結構
    發表于 11-22 07:54

    如何利用聯合體去判斷大小端呢

    聯合體的聲明:利用聯合體判斷大小端先請看下列代碼:由此,可以利用聯合體判斷大小端:同理,還有另一種方法判斷大小端:聯合大小的計算結構
    發表于 12-15 07:21

    測試結構成員內存對齊的方式方法

    //測試環境:keil for ARM//測試目的:通過keil仿真,介紹結構成員對齊方式 #pragma pack ()//定義一個聯合體類型 struct stru {int a
    發表于 12-21 07:37

    聯合體/共用的使用方法

    大家好,我是ZhengN。本次給分享聯合體的一些知識。聯合體/共用的使用 C語言中,聯合體/共用
    發表于 02-28 10:05

    結構struct和聯合體union的區別

    結構struct和聯合體union的區別
    發表于 10-11 08:21

    C語言:結構聯合體嵌套使用的實用操作

    ? 結構聯合體C語言中的構造類型,結構我們平時應該都用得很多。但是,對于
    的頭像 發表于 12-24 16:07 ?5764次閱讀
    <b class='flag-5'>C</b>語言:<b class='flag-5'>結構</b><b class='flag-5'>體</b>、<b class='flag-5'>聯合體</b>嵌套使用的實用操作

    什么是C語言的聯合體

    名{ 成員列表 }; 共用有時也被稱為聯合或者聯合體,這也是 Union 這個單詞的本意。 結構
    的頭像 發表于 07-29 15:35 ?4001次閱讀
    什么是<b class='flag-5'>C</b>語言的<b class='flag-5'>聯合體</b>

    c語言中結構聯合體區別

    結構聯合體C語言中的構造類型,結構我們平時應該都用得很多。但是,對于
    的頭像 發表于 12-03 14:25 ?2774次閱讀
    <b class='flag-5'>c</b>語言中<b class='flag-5'>結構</b><b class='flag-5'>體</b>有<b class='flag-5'>聯合體</b>的<b class='flag-5'>區別</b>

    看一下結構聯合體結合使用在C語言與嵌入式中的一些實用技巧

    結構聯合體C語言中的構造類型,結構我們平時應該都用得很多。但是,對于
    發表于 05-08 10:19 ?4446次閱讀
    看一下<b class='flag-5'>結構</b><b class='flag-5'>體</b>、<b class='flag-5'>聯合體</b>結合使用在<b class='flag-5'>C</b>語言與嵌入式中的一些實用技巧

    經典 C 語言編程,結構聯合體如何共用?

    中可以 使用 sizeof 進行獲取,默認為字節對齊的大小。 聯合體 聯合體的參數共享同一個內存地址,所占的內存大小完全是由
    的頭像 發表于 01-11 18:24 ?1747次閱讀
    經典 <b class='flag-5'>C</b> 語言編程,<b class='flag-5'>結構</b><b class='flag-5'>體</b>和<b class='flag-5'>聯合體</b>如何共用?