c語言->自定義類型聯合體和枚舉類型

系列文章目錄

文章目錄


前言

?作者簡介:大家好,我是橘橙黃又青,一個想要與大家共同進步的男人😉😉

🍎個人主頁:橘橙黃又青_C語言,函數,指針-CSDN博客

目的:學習聯合體和枚舉類型的聲明聯合體的特點和大小,枚舉類型的有點和使用。

1. 聯合體類型的聲明

像結構體?樣,聯合體也是由?個或者多個成員構成,這些成員可以不同的類型。
但是編譯器只為最?的成員分配?夠的內存空間。聯合體的特點是所有成員共?同?塊內存空間 。所 以聯合體也叫:共?體
給聯合體其中?個成員賦值,其他成員的值也跟著變化。
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};//計算連個變量的??printf("%d\n", sizeof(un));return 0;
}

輸出結果:

4

為什么是4呢?接下來我們來了看

?1.2 聯合體的特點

聯合的成員是共?同?塊內存空間的,這樣?個聯合變量的??,?少是最?成員的??(因為聯合 ?少得有能?保存最?的那個成員)。
我們來看兩個例子你就知道了
案例1:
//代碼1
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};// 下?輸出的結果是?樣的嗎?printf("%p\n", &(un.i));printf("%p\n", &(un.c));printf("%p\n", &un);return 0;
}

輸出結果:

可以看到,說明他們是公用一塊空間的,看圖解析:

案例2:

//代碼2
#include <stdio.h>
//聯合類型的聲明
union Un
{char c;int i;
};
int main()
{//聯合變量的定義union Un un = {0};un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);return 0;
}

輸出結果:

這又是怎么回事呢?分析:

也可以這樣理解:

假如,案例1的輸出結果為:

001AF85C
001AF85C
001AF85C

代碼1輸出的三個地址?模?樣,代碼2的輸出,我們發現將i的第4個字節的內容修改為55了。
我們仔細分析就可以畫出,un的內存布局圖。

1.3 相同成員的結構體和聯合體對?

結構體代碼1:

聯合體代碼2:

結構體和聯合體的內存對?:

1.4 聯合體??的計算

? 聯合的???少是最?成員的??。
? 當最?成員??不是最?對?數的整數倍的時候,就要對?到最?對?數的整數倍。

怎么理解呢?來看看一個例子:

#include <stdio.h>
union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{//下?輸出的結果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

輸出結果:

怎么算,來看這里:

使?聯合體是可以節省空間的,舉例:
?如,我們要搞?個活動,要上線?個禮品兌換單,禮品兌換單中有三種商品:圖書、杯?、襯衫。
每?種商品都有:庫存量、價格、商品類型和商品類型相關的其他信息。
圖書:書名、作者、?數
杯?:設計
襯衫:設計、可選顏?、可選尺?
那我們不耐?思考,直接寫出?下結構:
struct gift_list
{//公共屬性int stock_number;//庫存量double price; //定價int item_type;//商品類型//特殊屬性char title[20];//書名char author[20];//作者int num_pages;//?數char design[30];//設計int colors;//顏?int sizes;//尺?
};
上述的結構其實設計的很簡單,?起來也?便,但是結構的設計中包含了所有禮品的各種屬性,這樣 使得結構體的??就會偏?,?較浪費內存。因為對于禮品兌換單中的商品來說,只有部分屬性信息 是常?的。?如:
商品是圖書,就不需要design、colors、sizes。
所以我們就可以把公共屬性單獨寫出來,剩余屬于各種商品本?的屬性使?聯合體起來,這樣就可以 介紹所需的內存空間,?定程度上節省了內存。
代碼展示:
struct gift_list
{int stock_number;//庫存量double price; //定價int item_type;//商品類型union{//公用一塊空間,節省空間struct{char title[20];//書名char author[20];//作者int num_pages;//?數}book;struct{char design[30];//設計}mug;struct{char design[30];//設計int colors;//顏?int sizes;//尺?}shirt;}item;
};

1.5 聯合的?個練習

寫?個程序,判斷當前機器是?端?還是?端?
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是?端,返回0是?端
}

還有一個非常牛逼的代碼,當我看到的時候,我都震驚了,這也太6了,來看:

#include<stdio.h>
int check_sys() {union{int x;char a;}Un;Un.x = 1;// 計算機儲存方式 00 00 00 01如果是小端逆順序。return (Un.a);
}
int main()
{int ret = check_sys();if (ret == 1) {puts("小端");}else {puts("大端");}return 0;
}

輸出結果:

2. 枚舉類型 ?

2.1 枚舉類型的聲明
枚舉顧名思義就是??列舉。
把可能的取值??列舉。
比如:
1.?周的星期?到星期?是有限的7天,可以??列舉
2.性別有:男、?、保密,也可以??列舉
3.?份有12個?,也可以??列舉
4.三原?,也是可以意義列舉

?這些數據的表?就可以使?枚舉了

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性別
{MALE,FEMALE,SECRET
};
enum Color//顏?
{RED,GREEN,BLUE
};
以上定義的 enum Day enum Sex enum Color 都是枚舉類型。
{}中的內容是枚舉類型的可能取值,也叫 枚舉常量
這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值。
enum Color//顏?
{RED=2,GREEN=4,BLUE=8
};

2.2 枚舉類型的優點

1. 增加代碼的可讀性和可維護性
2. 和#define定義的標識符?較枚舉有類型檢查,更加嚴謹。
3. 便于調試,預處理階段會刪除 #define 定義的符號
4. 使??便,?次可以定義多個常量
5. 枚舉常量是遵循作?域規則的,枚舉聲明在函數內,只能在函數內使?

2.3 枚舉類型的使??

enum Color//顏?
{RED=1,GREEN=2,BLUE=4
};
enum Color clr = GREEN;//使?枚舉常量給枚舉變量賦值
那是否可以拿整數給枚舉變量賦值呢?在C語?中是可以的,但是在C++是不?的,C++的類型檢查? 較嚴格。
好了今天就到這里了,都看到這里了,點一個贊吧,謝謝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[cleanrl] ppo_continuous_action源碼解析

1 import庫&#xff08;略&#xff09; import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…

Kubernetes實戰(八)-防止k8s namespace被誤刪除

1 背景 運維新同學在預發環境操作刪除pod的時候&#xff0c;不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把預發環境刪了&#xff0c;幾十個模塊&#xff0c;將近一個小時才恢復。幸虧是測試環境啊&#xff0c;如果是生產可以可以跑路了。 2 解決方案…

jsonpath:使用Python處理JSON數據

使用Python處理JSON數據 25.1 JSON簡介 25.1.1 什么是JSON JSON全稱為JavaScript Object Notation&#xff0c;一般翻譯為JS標記&#xff0c;是一種輕量級的數據交換格式。是基于ECMAScript的一個子集&#xff0c;采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清…

java對二維數組進行排序

一、按行排序&#xff1a; 對二維數組按進行排序&#xff0c;直接調用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比較…

計算機網絡:應用層(一)

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

鴻蒙開發之狀態管理@Observed和@ObjectLink

一、使用場景 當對象內引用對象&#xff0c;改變內部對象屬性的時候其他狀態管理如State、Provide、Consume等是無法觸發更新的。同樣&#xff0c;在數組內如果有對象&#xff0c;改變對象的屬性也是無法更新的。在這種情況下就可以采用Observed和ObjectLink裝飾器了。 二、使…

C# WPF上位機開發(簡易圖像處理軟件)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 圖像處理是工業生產重要的環節。不管是定位、測量、檢測還是識別&#xff0c;圖像處理在工業生產中扮演重要的角色。而c#由于自身快速開發的特點&a…

玩轉 Go 語言并發編程:Goroutine 實戰指南

一、goroutine 池 本質上是生產者消費者模型在工作中我們通常會使用可以指定啟動的 goroutine 數量-worker pool 模式&#xff0c;控制 goroutine 的數量&#xff0c;防止 goroutine 泄漏和暴漲一個簡易的 work pool 示例代碼如下&#xff1a; package mainimport ("fmt…

小程序跳轉tabbar,tabbar頁面不刷新

文章地址&#xff1a;12.小程序 之切換到tabBar頁面不刷新問題_360問答 解決辦法備份&#xff1a; wx.switchTab&#xff1a;跳轉到 tabBar 頁面&#xff0c;并關閉其他所有非 tabBar 頁面 wx.reLaunch&#xff1a;關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLa…

解決微信小程序中 ‘nbsp;‘ 空格不生效的問題

在微信小程序開發中&#xff0c;我們經常會使用 來表示一個空格。這是因為在 HTML 中&#xff0c;空格會被解析為一個普通字符&#xff0c;而不會產生實際的空白間距。而 是一種特殊的字符實體&#xff0c;它被解析為一個不可見的空格&#xff0c;可以在頁面上產生真正的空…

力扣70. 爬樓梯

動態規劃 思路&#xff1a; 使用遞歸比較容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1級臺階有 f(n - 1)&#xff0c;到剩余2級臺階有 f(n-2)&#xff1b;邊界情況是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 遞歸代碼實現&#xff1a; class Soluti…

Axure RP 9 入門教程

1. Axure簡介 Axure 是一個交互式原型設計工具&#xff0c;可以幫助用戶創建復雜的交互式應用程序和網站。Axure 能夠讓用戶快速構建出具有高度可交互性的原型&#xff0c;可以在團隊中進行協作、分享和測試。 使用 Axure 可以設計出各種不同類型的原型&#xff0c;包括網站、移…

系列十五、搭建redis集群

一、概述 上篇文章介紹了redis集群的相關知識&#xff0c;本章實戰演示redis的集群環境的詳細搭建步驟。如果幫助到了你&#xff0c;請點贊 收藏 關注&#xff01;有疑問的話也可以評論區交流。 二、搭建步驟 2.1、預備知識 判斷一個集群中的節點是否可用&#xff0c;是集群…

【SpringBoot篇】詳解基于Redis實現短信登錄的操作

文章目錄 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate?常用的方法 &#x1f6f8;為什么我們要使用Redis代替Session進行登錄操作&#x1f386;具體使用?編寫攔截器?配置攔截器&#x1f33a;基于Redis實現發送手機驗證碼操作&am…

EarCMS 前臺任意文件上傳漏洞復現

0x01 產品簡介 EarCMS是一個APP內測分發系統的平臺。 0x02 漏洞概述 EarCMS前臺put_upload.php中,存在pw參數硬編碼問題,同時sql語句pdo使用錯誤,沒有有效過濾sql語句,可以控制文件名和后綴,導致可以任意文件上傳。 0x03 復現環境 FOFA:app="EearCMS" 0x0…

Flutter實現自定義二級列表

在Flutter開發中&#xff0c;其實系統已經給我們提供了一個可靠的二級列表展開的API&#xff08;ExpansionPanelList&#xff09;&#xff0c;我們先看系統的二級列表展開效果&#xff0c;一次只能展開一個&#xff0c;用ExpansionPanelList.radio實現 由此可見&#xff0c;已經…

容器化升級對服務有哪些影響?

容器技術是近幾年計算機領域的熱門技術&#xff0c;特別是隨著各種云服務的發展&#xff0c;越來越多的服務運行在以 Docker 為代表的容器之內。 本文我們就來分享一下容器化技術相關的知識。 容器化技術簡介 相比傳統虛擬化技術&#xff0c;容器技術是一種更加輕量級的操作…

分治法求最大子列和

給定N個整數的序列{ A1, A2, …, AN}&#xff0c;其中可能有正數也可能有負數&#xff0c;找出其中連續的一個子數列&#xff08;不允許空序列&#xff09;&#xff0c;使它們的和盡可能大&#xff0c;如果是負數&#xff0c;則返回0。使用下列函數&#xff0c;完成分治法求最大…

CorelDRAW軟件2024版本好用嗎?有哪些功能優勢

CorelDRAW是一款綜合性強大的專業平面設計軟件&#xff0c;其功能覆蓋了矢量圖形設計、高級文字編輯、精細繪圖以及多頁文檔和頁面設計。該軟件不僅適用于廣告設計、包裝設計&#xff0c;還廣泛應用于出版、網頁設計和多媒體制作等多個領域。下面就給大家介紹一下CorelDRAW這款…

0012Java安卓程序設計-ssm記賬app

文章目錄 **摘要**目 錄系統設計5.1 APP端&#xff08;用戶功能&#xff09;5.2后端管理員功能模塊開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 網絡的廣泛應用給生活帶來了十分的便利。所以把記賬管理與現在網絡相…