c语言结构体的位操作,C语言之路---结构体、位运算及预处理命令
一、結(jié)構(gòu)體
1)、概念
結(jié)構(gòu)體是一種集合,它里面包含了多個(gè)變量或數(shù)組,它們的類型可以相同,也可以不同,每個(gè)這樣的變量或數(shù)組都稱為結(jié)構(gòu)體的成員(Member)。
結(jié)構(gòu)體也是一種數(shù)據(jù)類型,它由程序員自己定義,可以包含多個(gè)其他類型的數(shù)據(jù)。
像 int、float、char 等是由C語(yǔ)言本身提供的數(shù)據(jù)類型,不能再進(jìn)行分拆,我們稱之為基本數(shù)據(jù)類型;而結(jié)構(gòu)體可以包含多個(gè)基本類型的數(shù)據(jù),也可以包含其他的結(jié)構(gòu)體,我們將它稱為復(fù)雜數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。
在C語(yǔ)言中,可以使用結(jié)構(gòu)體(Struct)來(lái)存放一組不同類型的數(shù)據(jù)。結(jié)構(gòu)體的定義形式為:
struct 結(jié)構(gòu)體名{
結(jié)構(gòu)體所包含的變量或數(shù)組
};
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在學(xué)習(xí)小組
float score; //成績(jī)
};
注意大括號(hào)后面的分號(hào);不能少,這是一條完整的語(yǔ)句。
stu 為結(jié)構(gòu)體名,它包含了 5 個(gè)成員,分別是 name、num、age、group、score。結(jié)構(gòu)體成員的定義方式與變量和數(shù)組的定義方式相同,只是不能初始化。
成員的獲取和賦值
,結(jié)構(gòu)體使用點(diǎn)號(hào).獲取單個(gè)成員。獲取結(jié)構(gòu)體成員的一般格式為:
結(jié)構(gòu)體變量名.成員名;
需要注意的是,結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,是創(chuàng)建變量的模板,不占用內(nèi)存空間;結(jié)構(gòu)體變量才包含了實(shí)實(shí)在在的數(shù)據(jù),需要內(nèi)存空間來(lái)存儲(chǔ)。
2)、結(jié)構(gòu)體變量
結(jié)構(gòu)體和結(jié)構(gòu)體變量是兩個(gè)不同的概念:結(jié)構(gòu)體是一種數(shù)據(jù)類型,是一種創(chuàng)建變量的模板,編譯器不會(huì)為它分配內(nèi)存空間,就像 int、float、char 這些關(guān)鍵字本身不占用內(nèi)存一樣;結(jié)構(gòu)體變量才包含實(shí)實(shí)在在的數(shù)據(jù),才需要內(nèi)存來(lái)存儲(chǔ)。
3)、結(jié)構(gòu)體數(shù)組
4)、結(jié)構(gòu)體和指針
指針也可以指向一個(gè)結(jié)構(gòu)體,定義的形式一般為:
struct 結(jié)構(gòu)體名 *變量名;
獲取結(jié)構(gòu)體成員
通過(guò)結(jié)構(gòu)體指針可以獲取結(jié)構(gòu)體成員,一般形式為:
(*pointer).memberName
或者:
pointer->memberName
第一種寫法中,.的優(yōu)先級(jí)高于*,(*pointer)兩邊的括號(hào)不能少。如果去掉括號(hào)寫作*pointer.memberName,那么就等效于*(pointer.memberName),這樣意義就完全不對(duì)了。
第二種寫法中,->是一個(gè)新的運(yùn)算符,習(xí)慣稱它為“箭頭”,有了它,可以通過(guò)結(jié)構(gòu)體指針直接取得結(jié)構(gòu)體成員;這也是->在C語(yǔ)言中的唯一用途。
上面的兩種寫法是等效的,我們通常采用后面的寫法,這樣更加直觀。
#include
int main(){
struct{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
//讀取結(jié)構(gòu)體成員的值
printf("%s的學(xué)號(hào)是%d,年齡是%d,在%c組,今年的成績(jī)是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的學(xué)號(hào)是%d,年齡是%d,在%c組,今年的成績(jī)是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
return 0;
}
運(yùn)行結(jié)果:
Tom的學(xué)號(hào)是12,年齡是18,在A組,今年的成績(jī)是136.5!
Tom的學(xué)號(hào)是12,年齡是18,在A組,今年的成績(jī)是136.5!
【示例】結(jié)構(gòu)體數(shù)組指針的使用。
#include
struct stu{
char *name; //姓名
int num; //學(xué)號(hào)
int age; //年齡
char group; //所在小組
float score; //成績(jī)
}stus[] = {
{"Zhou ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"Liu fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
}, *ps;
int main(){
//求數(shù)組長(zhǎng)度
int len = sizeof(stus) / sizeof(struct stu);
printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
for(ps=stus; ps
printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
}
return 0;
}
運(yùn)行結(jié)果:
Name Num Age Group Score
Zhou ping 5 18 C 145.0
Zhang ping 4 19 A 130.5
Liu fang 1 18 A 148.5
Cheng ling 2 17 F 139.0
Wang ming 3 17 B 144.5
二、枚舉類型(enum)
三、共用體(union)
四、C語(yǔ)言中位運(yùn)算
五、typedef給類型起個(gè)別名
typedef 是賦予現(xiàn)有類型一個(gè)新的名字,而不是創(chuàng)建新的類型。為了“見(jiàn)名知意”,請(qǐng)盡量使用含義明確的標(biāo)識(shí)符,并且盡量大寫。
typedef 在表現(xiàn)上有時(shí)候類似于 #define,但它和宏替換之間存在一個(gè)關(guān)鍵性的區(qū)別。正確思考這個(gè)問(wèn)題的方法就是把 typedef 看成一種徹底的“封裝”類型,聲明之后不能再往里面增加別的東西。
typedef 和 #define 的區(qū)別
typedef 在表現(xiàn)上有時(shí)候類似于 #define,但它和宏替換之間存在一個(gè)關(guān)鍵性的區(qū)別。正確思考這個(gè)問(wèn)題的方法就是把 typedef 看成一種徹底的“封裝”類型,聲明之后不能再往里面增加別的東西。
六、C語(yǔ)言中const:禁止修改變量的值
將 const 變量稱為常量(Constant)。創(chuàng)建常量的格式通常為:
const type name = value;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const int Mac=100;? ? ? ? ? ? ?首選
const 和 type 都是用來(lái)修飾變量的,它們的位置可以互換,也就是將 type 放在 const 前面:
type const name = value;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int? const Mac=100;
但我們通常采用第一種方式,不采用第二種方式。另外建議將常量名的首字母大寫,以提醒程序員這是個(gè)常量。
const 和指針
const 離變量名近就是用來(lái)修飾指針變量的,離變量名遠(yuǎn)就是用來(lái)修飾指針指向的數(shù)據(jù),如果近的和遠(yuǎn)的都有,那么就同時(shí)修飾指針變量以及它指向的數(shù)據(jù)
const 和函數(shù)形參
const 通常用在函數(shù)形參中,如果形參是一個(gè)指針,為了防止在函數(shù)內(nèi)部修改指針指向的數(shù)據(jù),就可以用 const 來(lái)限制。
總結(jié)
以上是生活随笔為你收集整理的c语言结构体的位操作,C语言之路---结构体、位运算及预处理命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言把四位数1234变成4123,用4
- 下一篇: xml android 字体,自定义字体