C語言結(jié)構(gòu)體、枚舉以及位域的講解

謹(jǐn)記

什么是價(jià)值?或許沒有多少人能夠明白,其實(shí)價(jià)值并不是實(shí)際存在的,它應(yīng)該是一種體現(xiàn),比如為城市點(diǎn)綴最美好的一面而起早摸黑的打掃的城市清潔工的大媽大爺;為中國航天事業(yè)而幾個(gè)月沒回家奮斗在一線的工程師們;為城市交通方便,上班不遲到的公交車司機(jī);為自己人生而奮斗終生的你等等。太多了,價(jià)值是無處不在的,不管你在身在何處,做著什么事,你都體現(xiàn)了你的一份價(jià)值,或許你的價(jià)值在別人心中是那么的偉大,又或者是那么的微小,請你一定要記住,你的一舉一動一言一行都決定了你的價(jià)值。

引用

前面我們學(xué)習(xí)了關(guān)于C語言很多的知識,希望大家都掌握了,對于C語言來說,大部分高級語法其實(shí)和C語言是想通的,所以,學(xué)好C語言將來你要轉(zhuǎn)其他語言是很輕松的。那么,今天我們將學(xué)習(xí)C語言的結(jié)構(gòu)體、枚舉以及簡單的介紹一下位域,希望讀者認(rèn)真的理解結(jié)構(gòu)體和枚舉。

結(jié)構(gòu)體

1、結(jié)構(gòu)體的定義

在實(shí)際的處理對象中,有許多信息是由多個(gè)不同類型的數(shù)據(jù)組合在一起進(jìn)行描述,而且這些不同類型的數(shù)據(jù)是互相聯(lián)系組成了一個(gè)有機(jī)的整體。此時(shí),就要用到一種新的構(gòu)造類型數(shù)據(jù)——結(jié)構(gòu)體(structure),簡稱結(jié)構(gòu)。
結(jié)構(gòu)體的作用:為了處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如動態(tài)數(shù)據(jù)結(jié)構(gòu)等)提供了有效的手段,而且,它們?yōu)楹瘮?shù)間傳遞不同類型的數(shù)據(jù)提供了方便。
結(jié)構(gòu)體和數(shù)組一樣,也是一種構(gòu)造型數(shù)據(jù)類型,是用戶自定義的新數(shù)據(jù)類型,在結(jié)構(gòu)體中可以包含若干個(gè)不同數(shù)據(jù)類型和不同意義的數(shù)據(jù)項(xiàng)(當(dāng)然也可以相同),從而使這些數(shù)據(jù)項(xiàng)組合起來反映某一個(gè)信息。
例如,可以定義一個(gè)學(xué)生student結(jié)構(gòu)體,在這個(gè)結(jié)構(gòu)體中包括學(xué)生學(xué)號、姓名、性
別、年齡、家庭住址、聯(lián)系電話。這樣就可以用一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型的變量來存放某個(gè)學(xué)生的所有相關(guān)信息。并且,用戶自定義的數(shù)據(jù)類型student也可以與int、double等基本數(shù)據(jù)類型一樣,用來作為定義其他變量的數(shù)據(jù)類型。

定義一個(gè)結(jié)構(gòu)體類型的一般形式為
struct  結(jié)構(gòu)體名
{
   數(shù)據(jù)類型   成員名1;
   數(shù)據(jù)類型   成員名2;
   :
   數(shù)據(jù)類型   成員名n;
};
在花括號中的內(nèi)容也稱為“成員列表”或“域表”。
其中,每個(gè)成員名的命名規(guī)則與變量名相同;
數(shù)據(jù)類型可以是基本變量類型和數(shù)組類型,或者是一個(gè)結(jié)構(gòu)體類型;
用分號“;”作為結(jié)束符。整個(gè)結(jié)構(gòu)的定義也用分號作為結(jié)束符。
struct student{   
    long number;
    char name[20];
    char gender;        
    int age;            //  age是成員名
    float salary;
    char address[80];
};                      //注意分號不能省略
int  age = 10;      //age是變量名 

結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,二者并不代表同一對象,編譯程序可以自動對它們進(jìn)行區(qū)分。
由于結(jié)構(gòu)體的成員的數(shù)據(jù)類型可以是任何類型,可能是基本變量類型、數(shù)組類型、結(jié)構(gòu)體類型、聯(lián)合體類型或枚舉類型等。

總結(jié)

結(jié)構(gòu)體類型的特點(diǎn):
a.結(jié)構(gòu)體類型是用戶自行構(gòu)造的;
b.它由若干不同的基本數(shù)據(jù)類型的數(shù)據(jù)構(gòu)成;
c.它屬于C語言的一種數(shù)據(jù)類型,與整型、浮點(diǎn)型相當(dāng)。因此,定義它時(shí)不分配空間,只有用它定義變量時(shí)才分配空間。

2、結(jié)構(gòu)體變量的聲明、初始化及運(yùn)用

2.1 結(jié)構(gòu)體變量的聲明
在定義了結(jié)構(gòu)體類型后,就可以聲明結(jié)構(gòu)體類型的變量。有下面幾種形式:
① 先定義結(jié)構(gòu)體類型,再定義變量名
定義結(jié)構(gòu)體變量的一般形式如下:

struct 結(jié)構(gòu)體名{
類型 成員名;
類型 成員名;
……
};
struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量名;

這里的結(jié)構(gòu)體名是結(jié)構(gòu)體的標(biāo)識符,不是變量名。類型可以是基本的數(shù)據(jù)類型也可以是其他構(gòu)造型數(shù)據(jù)類型。

struct Person
    {
        char array[20];
        char *name;
        int age;
        double height;
    };
    struct Person p;

注意

struct Person代表的是類型名,不能分開和省略寫,比如“struct P”;這是錯(cuò)誤的語法。

② 在定義類型的同時(shí),定義變量
這種形式的定義的一般形式為

struct 結(jié)構(gòu)體名
    {
類型 成員名;
類型 成員名;
……
    }變量名;
struct Person
    {
        char array[20];
        char *name;
        int age;
        double height;
    }per;

③ 直接定義結(jié)構(gòu)體變量
如果省略結(jié)構(gòu)體名,則稱之為無名結(jié)構(gòu)體,這種情況常常出現(xiàn)在函數(shù)內(nèi)部。
這種形式的定義的一般形式為

struct 
    {
類型 成員名;
類型 成員名;
……
    }變量名;
struct
    {
        char array[20];
        char *name;
        int age;
        double height;
    }per;

結(jié)構(gòu)體所占內(nèi)存空間大小

一個(gè)結(jié)構(gòu)體變量占用內(nèi)存的實(shí)際大小,可以利用sizeof求出。它的運(yùn)算表達(dá)式為
sizeof(運(yùn)算量)
其中運(yùn)算量可以是變量、數(shù)組或結(jié)構(gòu)體變量,可以是數(shù)據(jù)類型的名稱。這樣,就可以求出給定的運(yùn)算量占用內(nèi)存空間的字節(jié)數(shù)。
sizeof(struct person);
sizeof(per);

2.2、結(jié)構(gòu)體變量的使用
結(jié)構(gòu)體變量是不同數(shù)據(jù)類型的若干數(shù)據(jù)的集合體。在程序中使用結(jié)構(gòu)體變量時(shí),一般情況下不能把它作為一個(gè)整體參加數(shù)據(jù)處理,而參加各種運(yùn)算和操作的是結(jié)構(gòu)體變量的各個(gè)成員項(xiàng)數(shù)據(jù)。

結(jié)構(gòu)體變量的成員用以下一般形式表示:
    結(jié)構(gòu)體變量名.成員名

在定義了結(jié)構(gòu)體變量后,就可以用不同的賦值方法對結(jié)構(gòu)體變量的每個(gè)成員賦值。

per.age = 27;
per.name = "helloworld";

除此之外,還可以引用結(jié)構(gòu)體變量成員的地址以及成員中的元素。例如:引用結(jié)構(gòu)體變量成員的首地址&per.name;引用結(jié)構(gòu)體變量成員的第二個(gè)字符per.name[1];引用結(jié)構(gòu)體變量的首地址&per。

溫馨提示
結(jié)構(gòu)體變量在使用中應(yīng)注意以下幾點(diǎn)。
① 不能將一個(gè)結(jié)構(gòu)體類型變量作為一個(gè)整體加以引用,而只能對結(jié)構(gòu)體類型變量中的各個(gè)成員分別引用。

printf("%s",per);//這種寫法是錯(cuò)的
printf("%s\n",per.name);//這是可以的

舉一個(gè)完整的示例:

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    struct person {
        char name[20];
        int  age;
        double height;
    }per;
    memset(&per, 0, sizeof(per));
    printf("name:");
    scanf("%s",per.name);
        printf("age:");
    scanf("%d",&per.age);
    printf("height:");
    scanf("%lf",&per.height);
    printf("%s\n  %d\n %lf\n",per.name,per.age,per.height);
    return 0;
}
輸出結(jié)果:
name:helloworld
age:12
height:178
helloworld
  12
 178.000000
Program ended with exit code: 0

② 如果成員本身又屬一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符,一級一級地找到最低的一級成員。只能對最低級的成員進(jìn)行賦值或存取以及運(yùn)算。

#include <stdio.h>
#include <string.h>
#define N 64
struct employee{
    char name[N];
    struct {
        int year;
        int month;
        int day;
    }birthday;
    char gender;
    char address[N];
    float salary;
};
int main(int argc, const char * argv[]) {
    struct employee e1;
    memset(&e1, 0, sizeof(e1));
    printf("name:");
    scanf("%s", e1.name);
    printf("year:");
    scanf("%d", &e1.birthday.year);
    printf("month:");
    scanf("%d", &e1.birthday.month);
    printf("day:");
    scanf("%d", &e1.birthday.day);
    getchar();
    printf("gender:");
    scanf("%c", &e1.gender);
    printf("address:");
    scanf("%s", e1.address);
    printf("salary:");
    scanf("%f", &e1.salary);
    printf("\ninformation:%s %d-%d-%d %c %s %f\n", e1.name, e1.birthday.year,
            e1.birthday.month, e1.birthday.day, e1.gender, e1.address, e1.salary);
    return 0;
}
輸出結(jié)果:
name:zhangsan
year:1989
month:12
day:11
gender:m
address:Suzhou
salary:3200.5

information:zhangsan 1989-12-11 m Suzhou 3200.500000
Program ended with exit code: 0

在該程序中,結(jié)構(gòu)體的成員birthday,是一個(gè)結(jié)構(gòu)體類型的變量。對于這樣的變量,可以這樣訪問各成員:

e1.birthday.year
e1.birthday.month
e1.birthday.day

注意:不能用e1.birthday來訪問e1變量中的成員birthday,因?yàn)閎irthday本身是一個(gè)結(jié)構(gòu)體變量。
③ 對成員變量可以像普通變量一樣進(jìn)行各種運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算)。例如:

e2.age=e1.age;
sum=e1.age+e2.age;
e1.age++;

④ 在數(shù)組中,數(shù)組是不能彼此賦值的,而結(jié)構(gòu)體類型變量可以相互賦值。在C程序中,同一結(jié)構(gòu)體類型的結(jié)構(gòu)體變量之間允許相互賦值,而不同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量之間不允許相互賦值,即使兩者包含有同樣的成員。

2.3、結(jié)構(gòu)體變量初始化
與其他類型變量一樣,也可以給結(jié)構(gòu)體的每個(gè)成員賦初值,這稱為結(jié)構(gòu)體的初始化。一種是在定義結(jié)構(gòu)體變量時(shí)進(jìn)行初始化,語法格式如下:

struct  結(jié)構(gòu)體名 變量名={初始數(shù)據(jù)表};

另一種是在定義結(jié)構(gòu)體類型時(shí)進(jìn)行結(jié)構(gòu)體變量的初始化。

struct  結(jié)構(gòu)體名
{
類型 成員名;
類型 成員名;
……
}變量名={初始數(shù)據(jù)表}; 

這里就不在舉例了,后面的例子會用。

結(jié)構(gòu)體數(shù)組

具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量也可以組成數(shù)組,稱它們?yōu)榻Y(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的每一個(gè)數(shù)組元素都是結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個(gè)成員(分量)項(xiàng)。
定義結(jié)構(gòu)體數(shù)組的方法和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可??梢圆捎靡韵路椒?。
① 先定義結(jié)構(gòu)體類型,再用它定義結(jié)構(gòu)體數(shù)組,定義形式如下:

struct 結(jié)構(gòu)體名 
{
類型 成員名;
類型 成員名;
……

};
struct 結(jié)構(gòu)體名 數(shù)組名[元素個(gè)數(shù)];
#define N 64
struct employee{
    char name[N];
    int age;
    char gender;
    char address[N];
    float salary;
};
struct employee e[10];
這種聲明格式是最常見的。

② 定義結(jié)構(gòu)體類型的同時(shí),定義結(jié)構(gòu)體數(shù)組,定義形式如下:

struct 結(jié)構(gòu)體名 
{
類型 成員名;
類型 成員名;
……

}數(shù)組名[元素個(gè)數(shù)];
#define N 64
struct employee{
    char name[N];
    int age;
    char gender;
    char address[N];
    float salary;
} e[10];
這種情況,定義結(jié)構(gòu)體數(shù)組,不用重復(fù)寫結(jié)構(gòu)體類型,很簡潔。一般,當(dāng)需要聲明一個(gè)全局的結(jié)構(gòu)體數(shù)組時(shí),使用這種方式。

③ 直接定義結(jié)構(gòu)體數(shù)組,定義形式如下:

struct  
{
類型 成員名;
類型 成員名;
……

}數(shù)組名[元素個(gè)數(shù)];
#define N 64
struct{
    char name[N];
    int age;
    char gender;
    char address[N];
    float salary;
} e[10];

結(jié)構(gòu)體數(shù)組初始化
結(jié)構(gòu)體數(shù)組在定義的同時(shí)也可以進(jìn)行初始化,并且與結(jié)構(gòu)體變量的初始化規(guī)定相同。
結(jié)構(gòu)體數(shù)組初始化的一般形式是:

   struct 結(jié)構(gòu)體名  
    {
    類型 成員名;
    類型 成員名;
    ……
    };
    struct 結(jié)構(gòu)體名 數(shù)組名[元素個(gè)數(shù)]={初始數(shù)據(jù)表};
    或者
    struct 結(jié)構(gòu)體名 
    {
    類型 成員名;
    類型 成員名;
    ……
    }數(shù)組名[元素個(gè)數(shù)]={初始數(shù)據(jù)表};
    或者
    struct
    {
    類型 成員名;
    類型 成員名;
    ……
    }數(shù)組名[元素個(gè)數(shù)]={初始數(shù)據(jù)表};

由于結(jié)構(gòu)體變量是由若干不同類型的數(shù)據(jù)組成,而結(jié)構(gòu)體數(shù)組又是由若干結(jié)構(gòu)體變量組成。所以要特別注意包圍在大括號中的初始數(shù)據(jù)的順序,以及它們與各個(gè)成員項(xiàng)間的對應(yīng)關(guān)系。
結(jié)構(gòu)體數(shù)組的使用
一個(gè)結(jié)構(gòu)體數(shù)組的元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,因此前面介紹的有關(guān)結(jié)構(gòu)體變量的規(guī)則也適應(yīng)于結(jié)構(gòu)體數(shù)組元素。
(1)引用某一元素中的成員。
(2)可以將一個(gè)結(jié)構(gòu)體數(shù)組元素值賦給同一結(jié)構(gòu)體類型的數(shù)組中的另一個(gè)元素,或賦給同一類型的變量。
(3)不能把結(jié)構(gòu)體數(shù)組元素作為一個(gè)整體直接進(jìn)行輸入輸出。

#include <stdio.h>
#include <string.h>
#define N 64
struct employee{
    char name[N];
    struct {
        int year;
        int month;
        int day;
    }birthday;
    char gender;
    char address[N];
    float salary;
}e1[2] = { {"zhangsan", {1980, 9, 4}, 'w', "Shanghai", 3400}, 
           {"lisi", {1991, 10, 24}, 'w', "Hebei", 3400}};
int main(int argc, const char * argv[]) {
    struct employee e2[2] = {{"wangwu", {1986, 2, 24}, 'w', "Hubei", 6400}, 
                             {"Lucy", {1986, 8, 14}, 'w', "Henan", 3421}};
    int i;
    for (i = 0; i < sizeof(e1)/sizeof(struct employee); i++)
        printf("information :%s %d-%d-%d %c %s %f\n", e1[i].name, 
                e1[i].birthday.year, e1[i].birthday.month, e1[i].birthday.day, 
                e1[i].gender, e1[i].address, e1[i].salary);
    printf("\n");
    for (i = 0; i < sizeof(e2)/sizeof(struct employee); i++)
        printf("information :%s %d-%d-%d %c %s %f\n", e2[i].name, 
                e2[i].birthday.year, e2[i].birthday.month, e2[i].birthday.day, 
                e2[i].gender, e2[i].address, e2[i].salary);
    return 0;
}
在該程序中,聲明了兩個(gè)結(jié)構(gòu)體數(shù)組,一個(gè)全局?jǐn)?shù)組,一個(gè)局部數(shù)組。在聲明的同時(shí),寫初始化列表初始化。

結(jié)構(gòu)體指針

可以設(shè)定一個(gè)指針變量用來指向一個(gè)結(jié)構(gòu)體變量。此時(shí)該指針變量的值是結(jié)構(gòu)體變量的起始地址,該指針稱為結(jié)構(gòu)體指針。
結(jié)構(gòu)體指針與前面介紹的各種指針變量在特性和方法上是相同的。與前述相同,在程序中結(jié)構(gòu)體指針也是通過訪問目標(biāo)運(yùn)算“*”訪問它的對象。結(jié)構(gòu)體指針在程序中的一般定義形式為

struct 結(jié)構(gòu)體名  *結(jié)構(gòu)指針名;

其中的結(jié)構(gòu)體名必須是已經(jīng)定義過的結(jié)構(gòu)體類型。
例如,對于上一節(jié)中定義的結(jié)構(gòu)體類型struct employee,可以說明使用這種結(jié)構(gòu)體類型的結(jié)構(gòu)指針如下:

struct employee *p;

其中p是指向struct employee結(jié)構(gòu)體類型的指針。結(jié)構(gòu)體指針的說明規(guī)定了它的數(shù)據(jù)特性,并為結(jié)構(gòu)體指針本身分配了一定的內(nèi)存空間。但是指針的內(nèi)容尚未確定,即它指向隨機(jī)的對象,需要為指針變量賦初值。

#include <stdio.h>
#include <string.h>
#define N 64
struct employee{
    char name[N];
    int age;
    char gender;
    char address[N];
    float salary;
};
void input(struct employee *p){
    printf("name:");
    scanf("%s", p->name);
    printf("age:");
    scanf("%d", &p->age);
    getchar();
    printf("gender:");
    scanf("%c", &p->gender);
    printf("address:");
    scanf("%s", p->address);
    printf("salary:");
    scanf("%f", &p->salary);
}
void output(struct employee *p){
    printf("information:%s %d %c %s %f\n", p->name, p->age,
            p->gender, p->address, p->salary);
}
int main(int argc, const char * argv[]) {
    struct employee e1;
    memset(&e1, 0, sizeof(e1));
    input(&e1);
    output(&e1);
    return 0;
}
輸出結(jié)果:
name:zhao
age:21
gender:m
address:Shanghai
salary:3421.1
information:zhao 21 m Shanghai 3421.100098
Program ended with exit code: 0

枚舉

在C語言中還有一種構(gòu)造類型,即枚舉。在實(shí)際問題中,有些變量只有幾種可能的取值。例如:一周有七天,程序中的錯(cuò)誤只有那么幾種等。針對這樣特殊的變量,C語言中提供了“枚舉”類型,在枚舉的定義中,會將變量的值一一列出來。當(dāng)然,枚舉類型的變量的值也就只限于列舉出來的值的范圍內(nèi)。
枚舉類型的定義
枚舉類型的定義形式如下:
enum 枚舉名{ 枚舉成員列表 };
在枚舉成員列表中列出所有可能的取值,以分號結(jié)尾。注意和結(jié)構(gòu)體、聯(lián)合體類似,“enum 枚舉名”是新定義的類型名。
舉例如下:

enum TimeofDay 
{ 
morning, 
afternoon, 
evening
};

該枚舉名為TimeofDay,共有3種可能的取值。在定義該枚舉類型的變量時(shí),也只能取其中的一個(gè)值,進(jìn)行賦值。
枚舉變量的聲明
其實(shí)枚舉變量的聲明和我們上面說的結(jié)構(gòu)體變量的聲明是一樣的。
方式一:先定義類型,再聲明變量

enum TimeofDay 
{ 
morning, 
afternoon, 
evening 
};
enum TimeofDay a, b;

方式二:在定義類型的同時(shí),聲明變量

enum TimeofDay 
{ 
morning, 
afternoon, 
evening 
} a, b;

方式三:直接定義無名枚舉變量

   enum 
    { 
    morning, 
    afternoon, 
    evening 
    } a, b;

枚舉變量的使用
通過一個(gè)示例來說吧

#include <stdio.h>
enum TimeofDay{
    morning = 2,
    afternoon,
    evening
}a;
int main(int argc, const char * argv[]) {
    enum TimeofDay b, c;
    a = morning;
    b = afternoon;
    c = evening;
    printf("a=%d b=%d c=%d\n", a, b, c);
    c = 10;
    printf("a=%d b=%d c=%d\n", a, b, c);
    return 0;
}
運(yùn)行結(jié)果:
a=2 b=3 c=4
a=2 b=3 c=10
Program ended with exit code: 0

通過該程序,可以看出,可以把枚舉成員的值賦予枚舉變量,也可以把整數(shù)值直接賦予枚舉變量。實(shí)際上,枚舉變量,也是一種整型變量,因此,也可以使用switch-case結(jié)構(gòu),示例程序如下:

#include <stdio.h>
enum TimeofDay{
    morning,
    afternoon,
    evening
};
int main(int argc, const char * argv[]) {
    int i, j;
    enum TimeofDay a[10];
    j = morning;
    for (i = 0; i < 10; i++)
    {
        a[i] = j;
        j++;
        if (j > evening)
            j = morning;
    }
    for (i = 0; i < 10; i++)
    {
        switch (a[i])
        {
            case morning: printf("%d morning\n", a[i]); break;
            case afternoon: printf("%d afternoon\n", a[i]); break;
            case evening: printf("%d evening\n", a[i]); break;
            default:break;
        }
    }
    return 0;
}
輸出結(jié)果:
0 morning
1 afternoon
2 evening
0 morning
1 afternoon
2 evening
0 morning
1 afternoon
2 evening
0 morning
Program ended with exit code: 0

位域的介紹

在這里,對于位域,只是一個(gè)簡單的介紹,這個(gè)用的不是很多,如果真需要用,建議讀者去官網(wǎng)看教程。
位域的定義
所謂“位域”是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個(gè)不同的對象用一個(gè)字節(jié)的二進(jìn)制位域來表示。
位域的定義與結(jié)構(gòu)體的定義相似,其一般形式如下:

struct 位域結(jié)構(gòu)名
{   
  位域列表 
};

其中位域列表的形式為

類型說明符 位域名:位域長度

例如:

 struct data{
    unsigned int a:2;
    unsigned int b:3;
    unsigned int c:3;
};
其中a表示data的低兩位,表示data的3~5位,c表示data的6~8位。

關(guān)于位域的定義,有一些問題需要注意。
① 個(gè)位域必須存儲在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。
② 位域的占用的位數(shù),不能超過8個(gè)二進(jìn)制位。
③ 允許位域無域名。
位域的使用
位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為
位域變量名.位域名
示例代碼

#include <stdio.h>
struct data{
    unsigned int a: 2;
    unsigned int b: 4;
    unsigned int: 0;
    unsigned int c: 3;
}t;
int main(int argc, const char * argv[]) {
    struct data *p;
    t.a = 3;
    t.b = 5;
    t.c = 6;
    printf("t.a=%d t.b=%d t.c=%d\n",t.a, t.b, t.c);
    p = &t;
    p->a = 2;
    p->b &= 0;
    p->c |= 1;
    printf("t.a=%d t.b=%d t.c=%d\n",t.a, t.b, t.c);
    return 0;
}
輸出結(jié)果:
t.a=3 t.b=5 t.c=6
t.a=2 t.b=0 t.c=7
Program ended with exit code: 0
說明:由于位域中的各個(gè)域是以二進(jìn)制位為單位,因此,大部分的位域程序,都有位運(yùn)算

總結(jié)

本篇文章介紹了C語言的結(jié)構(gòu)體、枚舉、位域,以及結(jié)構(gòu)體和數(shù)組、指針的聯(lián)系,內(nèi)容比較多,希望讀者認(rèn)真的理解和體會,那么,在這里,C語言的基礎(chǔ)知識點(diǎn)我們都已經(jīng)學(xué)的差不多了。希望能給讀者帶來幫助。

結(jié)尾

希望讀者真誠的對待每一件事情,每天都能學(xué)到新的知識點(diǎn),要記住,認(rèn)識短暫,開心也是過一天,不開心也是一天,無所事事也是一天,小小收獲也是一天,歡迎收藏和點(diǎn)贊、喜歡。最后送讀者一句話:你的路你自己選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容