本文目錄一覽:
c語言 關於位域的使用
一、位域
有些信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進位位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域,
並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進位位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct
位域結構名
{
位域列表
};
其中位域列表的形式為:
類型說明符
位域名:位域長度
如
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
};
位域變數的說明與結構變數說明的方式相同。
可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
}data;
說明data為bs變數,共佔兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:
1.
一個位域必須存儲在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct
bs
{
unsigned
a:4
unsigned
:0
/*空域*/
unsigned
b:4
/*從下一單元開始存放*/
unsigned
c:4
}
在這個位域定義中,a占第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。
2.
由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。
3.
位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct
k
{
int
a:1
int
:2
/*該2位不能使用*/
int
b:3
int
c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型,
不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為:
位域變數名·位域名
位域允許用各種格式輸出。
main(){
struct
bs
{
unsigned
a:1;
unsigned
b:3;
unsigned
c:4;
}
bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf(“%d,%d,%d\n”,bit.a,bit.b,bit.c);
pbit=bit;
pbit-a=0;
pbit-b=3;
pbit-c|=1;
printf(“%d,%d,%d\n”,pbit-a,pbit-b,pbit-c);
}
上常式序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變數bit和指向bs類型的指針變數pbit。這表示位域也是可以使用指針的。
程序的9、10、11三行分別給三個位域賦值。(
應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指針變數pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了複合的位運算符”=”,
該行相當於:
pbit-b=pbit-b3位域b中原有值為7,與3作按位與運算的結果為3(111011=011,十進位值為3)。同樣,程序第16行中使用了複合位運算”|=”,
相當於:
pbit-c=pbit-c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。
C語言問題:內存的分配方式有哪幾種?
1、靜態存儲區分配
內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。
2、棧上分配
在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。
3、堆上分配
堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。
擴展資料
棧上分配數組
#includeiostream
usingnamespacestd;
voidmain()
{
int**arr=NULL;//int型二維數組
introws,columns;
cinrows;//2
cincolumns;//3
//請在此處編寫代碼,根據rows和columns在棧上分配一個數組arr
…你的代碼…
//賦值給數組元素
for(introwIndex=0;rowIndexrows;rowIndex++)
{
for(intcolumnIndex=0;columnIndexcolumns;columnIndex++)
{
arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;
}
}
//列印每個數組元素
for(rowIndex=0;rowIndexrows;rowIndex++)
{
for(intcolumnIndex=0;columnIndexcolumns;columnIndex++)
{
printf(“%d”,arr[rowIndex][columnIndex]);
}
printf(“\n”);
}
}
C語言:內存分哪幾個區?各有什麼用?
靜態區:全局初始化區,全局未初始化區堆區:程序動態申請內存的區域棧區:系統分配內存的區域如:int va = 30;string sa;int main(){int a = 1;int* pa = new int[10];}va分配在全局初始化區,sa分配在全局未初始化區,a分配在棧區,pa指向的數據分配在堆區(pa本身分配在棧區)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/197215.html