1. 程式人生 > >C語言 struct結構體的變數宣告加冒號

C語言 struct結構體的變數宣告加冒號

有些資訊在儲存時,並不需要佔用一個完整的位元組,而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有01兩種狀態,用一位二進位即可。

為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為位域位段。所謂位域是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。

1】定義:

struct 位域結構名
{
位域列表 };

位域列表的形式型別說明符位域名:位域長度

例如:

structbs
{

int a:8;

int b:2;

int c:6;


}data;

說明:databs變數,其中位域a8位,位域b2位,位域c6位。(一個位元組8)

2】位域可以無位域名,這時它只用來作填充或調整位置。

無名的位域是不能使用的。

例如:

typedef structk
{

int a:1

int :2

int b:3

int c:2

};

從以上分析可以看出,位域在本質上就是一種結構型別,不過其成員是按二進位分配的。

3】指標型別變數不能指定所佔的位數

這點很好理解,在c語言中,所有的指標型別統一佔4位元組,不能更改。

4struct變數二進位制位數簡要說明

例如:定義結構體如下:

typedefstruct test

{

inta:2;

unsignedintb:2;

};

對於結構體test來說,ab成員都是佔用兩位二進位制,但儲存的最大值是不一樣的。其中:a是有符號型,所以第一位用來儲存符號,代表的最大值為二進位制“+1”,即1b為無符號型,代表的最大值為二進位制“11”,即3。此結構體佔用的大小為4位元組,而不是4位額!

記住:位域成員不能單獨被取sizeof,且給位域變數成員賦值時,當數值超過變數範圍,自動擷取不會報錯!

使用位域的主要目的是壓縮儲存,其大致規則為:
1)
如果相鄰位域欄位的型別相同,且其位寬之和小於型別的sizeof大小,則後面的欄位將緊鄰前一個欄位儲存,直到不能容納為止;
2)

如果相鄰位域欄位的型別相同,但其位寬之和大於型別的sizeof大小,則後面的欄位將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

示例1structBF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};

其記憶體佈局為:
|__f1___|____f2___ |__|____f3______|______|
|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|

位域型別為
char,第1個位元組僅能容納下f1f2,所以f2被壓縮到第1個位元組中,而f3能從下一個位元組開始。因此sizeof(BF1)的結果為2


3)
如果相鄰的位域欄位的型別不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式,Dev-C++採取壓縮方式;

示例2structBF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由於相鄰位域型別不同,在VC6中其sizeof6,在Dev-C++中為2


4)
如果位域欄位之間穿插著非位域欄位,則不進行壓縮;

示例3structBF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
非位域欄位穿插在其中,不會產生壓縮,在VC6Dev-C++中得到的大小均為3

舉這些例子是為了說明一下,定義位域的話,最好是把所以有位域放在一起,這樣可以節省空間,另外也是為了強調一下位結構體的記憶體分配方式,按定義的先後順序來分配


5)
整個結構體的總大小為最寬基本型別成員大小的整數倍!——永遠成立!

還是讓我們來看看例子,你會感到不可思議:

struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
} test;
=> sizeof(test) ==2;

struct mybitfields
{
unsigned char a : 4;
unsigned char b : 5;
unsigned char c : 7;
} test;
=> sizeof(test) ==3;

struct mybitfields
{
unsigned char a : 4;
unsigned short b : 5;
unsigned char c : 7;
} test;
=> sizeof(test) ==6;

struct mybitfields
{
unsigned short a : 4;
unsigned char b : 5;
unsigned char c : 7;
} test;
=> sizeof(test) ==4;

struct mybitfields
{
unsigned char a : 4;
unsigned char b : 5;
unsigned short c : 7;
} test;
=> sizeof(test) ==4;

struct mybitfields
{
unsigned char a : 4;
unsigned int b : 5;
unsigned short c : 7;
} test;
=> sizeof(test) ==12;

5】常用內建型別的位元組數

對於32位編譯器來說:

char1個位元組

指標變數:4個位元組(32位的定址空間是2^32,32bit,也就是4個位元組。同理64位編譯器)

short int :2個位元組

int4個位元組

unsigned int :4個位元組

float:4個位元組

double:8個位元組

long:4個位元組

long long:8個位元組

unsigned long:4個位元組

相關推薦

C語言 struct結構變數宣告冒號

有些資訊在儲存時,並不需要佔用一個完整的位元組,而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1兩種狀態,用一位二進位即可。 為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結

C語言 Struct 結構在 Java 中的體現

修飾符 無法 輸入 更多 好用 ++ [] 的區別 import   大一整個學期完成了 C 語言的學習,大二就進入了Java 的學習。   和C語言一樣,我們都會嘗試寫一個小小的學生管理系統什麽的,學習過 C 語言同學知道,在管理系統中 Struct 結構體是個很好用的東

簡析c語言結構宣告使用以及位段

1.結構體的定義 聚合資料型別能夠同時儲存超過一個的單獨資料。c語言中提供了兩種型別的聚合資料型別,陣列和結構。結構也是一些值的集合,這些值稱為它的成員。但每個成員可能具有不同的資料型別。結構體變數屬於標量型別,所以你可以像對待其他標量型別那樣執行相同型別的操作。結構體也可

C語言結構變數之間賦值

/********************************************************************** * 版權所有 (C)2015, Zhou Zhaoxiong。 * * 檔名稱:Struct2Struct.c * 檔案標識:無 * 內容摘要:結構體變數之間的賦值

C#語言struct結構適用場景和注意事項

C#中struct結構體是一個特殊的存在,值型別棧內拷貝。struct和class定義上有些相似,區別主要是值型別和引用型別的區別。Winform中涉及到原生代碼的地方大量使用了struct,這很大程度上是為了程式碼移植的需要,不能作為我們寫程式碼的規範參考。我

C語言結構中字串的宣告(採用字元指標還是字元陣列)

      結構體中,字串選項是用字元陣列表示好,還是用字元指標表示好? typedef struct person{ char *name; int age; char sex[6]; }       該結構體中name用的是指標而不是陣列,所以需要給字串在堆上申

C語言變數宣告冒號的用法 稱為“位域”或“位段“

 有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃

C語言根據結構成員變數的地址,得到結構的地址

/** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container s

C語言變數宣告冒號的用法

有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為

C 語言結構

ons nbsp span clas %d str style ret [] 1 #include <stdio.h> 2 3 #include <struct.h> 4 5 #include <string.h>

C語言結構參數變量的傳遞

結構體 函數 參數 傳遞 c語言 結構體 函數 參數 傳遞 一、前言 本文中的程序實現對員工信息結構體字段賦值並打印出來的功能。該結構體的定義如下:// 員工信息結構體 typedef struct { INT8 szEmployeeName[100];

11、C語言結構和共用

結構體數組 結構體 float add font sco 規則 student mon 一、結構體   結構體:是一種自定義的構造數據類型   用途:把不同類型的數據組合成一個整體。     結構體類型定義:     struct [結構體名]    {       類型識

C語言小結--結構

1 什麼是結構體 結構體是一種聚合資料型別,它是一種資料元素的聚合。比如我們描述一個學生時,要求有他的姓名、學校、分數等等資訊,在之前的處理中,我們通常會使用單獨的資料型別來描述。比如,定義一個字串陣列來描述姓名char name[20] = "xiaoming",定義一個浮點數來描

C語言結構詳解(轉載只是為了查閱方便,若有侵權立刪)

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

C語言結構 共用 列舉 typedef

結構體型別和結構體變數, struct 定義結構體型別時 不佔記憶體 匿名結構體,無法建立變數訪問,有限的結構體型別變數 結構體變數不能整體引用,只能引用變數成員 結構體變數用大括號賦值,只有在建立並初始化的時候才可以 #define _CRT_SECURE_NO_WARN

rust學習筆記基礎篇4--結構變數宣告與繫結,所有權,借用,引用(霜之小刀)

rust學習筆記基礎篇4–結構體變數宣告與繫結,所有權,借用,引用(霜之小刀) 歡迎轉載和引用,若有問題請聯絡 若有疑問,請聯絡 Email : [email protected] QQ:2279557541 關於結構體的變數宣告 看過前面

C語言結構、列舉型別、型別定義)

結構體的定義 1、`struct 結構體名 { 成員型別 成員名; … }; 2、省略結構體名 struct { 成員型別 成員名; ... }結構體變數名; 成員可以是其他已定義結構體的型別,但不能是自己結構體的型別,可以是自己結構體的指標。 定義

C++ primer plus書之--C++函式和C語言字串, 結構, string

函式和C風格字串 要將C風格字串作為引數傳遞給函式, 表示字串的方式有三種: 1.char陣列 2.用""擴起來的字串常量 3.被設定為字串地址的char指標 來看一個例子: // c風格字串例子 #include "iostream" using namespace std

C語言結構

1.結構體 a.概念:結構是一些值得集合,這些值成為成員變數。結構的每個成員可以是不同型別的變數。 b.宣告: eg宣告一個學生資訊的結構體。 struct Stu { char name[20]; short int age;

C語言結構佔用記憶體問題

之前對結構體佔用記憶體一直很混亂,到底是按照哪個變數型別計算記憶體?還是怎麼計算?下面先看一個例子: 1 2 3 4 5 6 7 struct str1 { char a;