C語言union關鍵字

union 關鍵字的用法與struct 的用法非常類似。

union 維護足夠的空間來置放多個數據成員中的“一種”,而不是為每一個數據成員配置空間,在union 中所有的數據成員共用一個空間,同一時間只能儲存其中一個數據成員,所有的數據成員具有相同的起始地址。例子如下:
union StateMachine
{
? ?char character;
? ?int number;
? ?char *str;
? ?double exp;
};

一個union 只配置一個足夠大的空間以來容納最大長度的數據成員,以上例而言,最大長度是double 型態,所以StateMachine 的空間大小就是double 數據類型的大小。

在C++里,union 的成員默認屬性頁為public。union 主要用來壓縮空間。如果一些數據不可能在同一時間同時被用到,則可以使用union。

一、大小端模式對union 類型數據的影響

下面再看一個例子:
union
{
? ?int i;
? ?char a[2];
}*p, u;
p =&u;
p->a[0] = 0x39;
p->a[1] = 0x38;

p.i 的值應該為多少呢?

這里需要考慮存儲模式:大端模式和小端模式。
  1. 大端模式(Big_endian):字數據的高字節存儲在低地址中,而字數據的低字節則存放在高地址中。
  2. 小端模式(Little_endian):字數據的高字節存儲在高地址中,而字數據的低字節則存放在低地址中。
union 型數據所占的空間等于其最大的成員所占的空間。對union 型的成員的存取都是相對于該聯合體基地址的偏移量為0 處開始,也就是聯合體的訪問不論對哪個變量的存取都是從union 的首地址位置開始。如此一解釋,上面的問題是否已經有了答案呢?

二、如何用程序確認當前系統的存儲模式?

上述問題似乎還比較簡單,那來個有技術含量的:請寫一個C 函數,若處理器是Big_endian 的,則返回0;若是Little_endian 的,則返回1。

先分析一下,按照上面關于大小端模式的定義,假設int 類型變量i 被初始化為1。

以大端模式存儲,其內存布局如下圖:
以小端模式存儲,其內存布局如下圖:
變量i 占4 個字節,但只有一個字節的值為1,另外三個字節的值都為0。如果取出低地址上的值為0,毫無疑問,這是大端模式;如果取出低地址上的值為1,毫無疑問,這是小端模式。既然如此,我們完全可以利用union 類型數據的特點:所有成員的起始地址一致。

到現在,應該知道怎么寫了吧?參考答案如下:
int checkSystem( )
{
? ?union check
? ?{
? ? ? int i;
? ? ? char ch;
? ?} c;
? ?c.i = 1;
? ?return (c.ch ==1);
}

現在你可以用這個函數來測試你當前系統的存儲模式了。當然你也可以不用函數而直接去查看內存來確定當前系統的存儲模式。如下圖:
圖中0x01 的值存在低地址上,說明當前系統為小端模式。

不過要說明的一點是,某些系統可能同時支持這兩種存儲模式,你可以用硬件跳線或在編譯器的選項中設置其存儲模式。

留個問題:在x86 系統下,輸出的值為多少?
#include <stdio.h>
intmain()
{
? ?int a[5]={1,2,3,4,5};
? ?int *ptr1=(int *)(&a+1);
? ?int *ptr2=(int *)((int)a+1);
? ?printf("%x,%x",ptr1[-1],*ptr2);
? ?return 0;
}

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

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

相關文章

js 深拷貝 和 淺拷貝

1、 ...運算符 &#xff08;淺拷貝&#xff09; let obj {a:1,b:2}; let obj2 {...obj}; obj.a3 obj //{a: 3, b: 2} obj2 //{a: 1, b: 2}a {a:[{b:1}]}; b a ;b.a[0].b 2; //b {a:[{b:2}]}a // a {a:[{b:2}]} 2、 JSON.parse(JSON.stringify(參數))…

軟考如何備考

軟考上半年 報名時間 3月 考試時間 5月 備考持續時間&#xff1a;一個半月&#xff0c;每天至少兩個小時。 第一輪 基礎知識輪&#xff0c; 15天 在這一輪中如果碰到無法理解的知識點一定不要過于糾結&#xff0c;往后學&#xff0c;一般后面的學著學著之前的內容就…

Python學習第一天-第2節

*本節課內容參見&#xff1a;https://www.cnblogs.com/jin-xin/articles/7459977.html運行第一個Python程序 print(hello world) 將文本文件保存為以.py結尾的文件&#xff0c;如hello_world.py &#xff0c;在終端中&#xff0c;運行命令&#xff1a;Python hello_world.py&am…

SpringMVC之組合注解@GetMapping

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Spring4.3中引進了&#xff5b;GetMapping、PostMapping、PutMapping、DeleteMapping、PatchMapping&#xff5d;&#xff0c;來幫助簡化…

資源下載地址

1、nginx http://nginx.org/en/download.html 2、nodejs http://nodejs.cn/download/ 3、vscode https://code.visualstudio.com/ 4、canal https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz 5、jenkins https://jenkins.io/i…

C語言volatile關鍵字—最易變的關鍵字

volatile 是易變的、不穩定的意思。很多人根本就沒見過這個關鍵字&#xff0c;不知道它的存在。也有很多程序員知道它的存在&#xff0c;但從來沒用過它。我對它有種“楊家有女初長成,養在深閨人未識” 的感覺。volatile 關鍵字和const 一樣是一種類型修飾符&#xff0c;用它修…

mysql 備份腳本

#!/bin/bash INNOBACKUPEXFULL"/usr/bin/innobackupex" MYSQL_CMD --socket/ssd/mysql/3346/tmp/mysql.sock --userroot --passwordmysqlpassword --port3346 MYSQL_UP --userroot --passwordmysqlpassword --port3346 #mysqladmin的用戶名和密碼 TMPLOG"/dat…

爆棧的處理方法

爆棧指遞歸中&#xff0c;存儲的信息量大于系統棧的內存。 信息量包括元素編號&#xff0c;每一層中開的變量。 和遞歸的層數正相關。 &#xff08;雖然noip一般開棧&#xff09; 1.手寫棧 while(top){ int xsta[top]; for(each son) if(has son){ //blablabla sta[top]son; h…

項目面試題

項目面試題 1.描述最熟悉的或者&#xff08;最近&#xff09;的一個項目 &#xff1f; 目的&#xff1a;檢測技術和項目的熟悉程度工作職責 回答&#xff1a;項目名稱&#xff0c;項目的甲方&#xff0c;背景&#xff0c;實現的目的和意義&#xff0c;該項目主要是為了解決什…

MySQL定時備份(全量備份+增量備份)

MySQL 定時備份 參考 zone7_ 的 實戰-MySQL定時備份系列文章 參考 zmcyu 的 mysql數據庫的完整備份、差異備份、增量備份 更多binlog的學習參考馬丁傳奇的 MySQL的binlog日志&#xff0c;這篇文章寫得認真詳細&#xff0c;如果看的認真的話&#xff0c;肯定能學的很好的。 如果…

java 接口可以多繼承

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 接口是常量值和方法定義的集合。接口是一種特殊的抽象類。 java類是單繼承的。classB Extends classA java接口可以多繼承。Interface…

C語言struct關鍵字詳解—結構體

struct 是個神奇的關鍵字&#xff0c;它將一些相關聯的數據打包成一個整體&#xff0c;方便使用。在網絡協議、通信控制、嵌入式系統、驅動開發等地方&#xff0c;我們經常要傳送的不是簡單的字節流&#xff08;char 型數組&#xff09;&#xff0c;而是多種數據組合起來的一個…

JDK1.8使用Dubbo時需注意

2019獨角獸企業重金招聘Python工程師標準>>> Dubbo自帶的很多包都比較舊了&#xff0c;其中的javassist在JDK1.8上運行會報錯 而且錯誤通常比較詭異&#xff0c;javassist是編輯和創建Java字節碼的類庫&#xff0c;常見的錯誤會從spring中報出 解決辦法&#xff1a;…

Java 11 已發布,String 還能這樣玩!

在文章《Java 11 正式發布&#xff0c;這 8 個逆天新特性教你寫出更牛逼的代碼》中&#xff0c;我有介紹到 Java 11 的八個新特性&#xff0c;其中關于 String 加強部分&#xff0c;我覺得有點意思&#xff0c;這里單獨再拉出來講。 Java 11 增加了一系列的字符串處理方法&…

Redis1 晨考題

Redis1 晨考題 1.Redis 是什么 &#xff1f; redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value 的內存數據庫&#xff0c;并提供多種語言的 API。 2.NOSQL 是什么 &#xff1f;出現的目的和意義是什么 &#xff1f; NoSQL 泛指…

C語言void關鍵字

void 有什么好講的呢&#xff1f;如果你認為沒有&#xff0c;那就沒有&#xff1b;但如果你認為有&#xff0c;那就真的有。有點像“色即是空&#xff0c;空即是色”。一、void a&#xff1f; void 的字面意思是“空類型”&#xff0c;void *則為“空類型指針”&#xff0c;vo…

深入了解RabbitMQ工作原理及簡單使用

深入了解RabbitMQ工作原理及簡單使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的環境搭建深入了解RabbitMQ工作原理及簡單使用RabbitMQ交換器Exchange介紹與實踐RabbitMQ事務和Confirm發送方消息確認——深入解讀使用Docker部署RabbitMQ集群你不知道的RabbitMQ集群架構全解RabbitM…

使用el-checkbox實現全選,點擊失效沒有反應

最近在公司接收到了一個需求&#xff0c;給收藏夾的書籍添加批量、全選刪除實現思路&#xff1a;點擊全選改變item的checked&#xff0c;改變item的checked&#xff0c;重新便利一下所有item的checked來改變全選的selectAll1&#xff09;該組件基本功能已經實現&#xff0c;che…

Spring3.2新注解@ControllerAdvice

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ControllerAdvice&#xff0c;是spring3.2提供的新注解&#xff0c;從名字上可以看出大體意思是控制器增強。讓我們先看看ControllerAdv…

Mysql1 晨考題

Mysql1 晨考題 1.描述主鍵、外鍵、候選主鍵、超鍵分別是什么 &#xff1f; &#xff08;1&#xff09;主鍵&#xff1a;數據庫表中對存儲數據對象給予唯一完整標識的數據列或屬性的組合。一個數據列只能有一個主 鍵&#xff0c;且主鍵的取值不能缺失&#xff0c;即不能為空值…