第十一章? 結構體與共用體
一、結構體
1、結構體
一般形式? ? ?【struct? ?標識符】
結構體中的標識符一般首字母大寫;
【.】結構體成員運算符;? 優先級 1 級? ? 結合方向:從左至右;
【->】:指向結構體成員運算符;
eg:
#include<stdio.h>
struct Student
{int id;char name[10];float score;
}; //此處的分號不能省略;也可以在分號前定義變量,為全局變量;
int main(void)
{struct Student s;s.id = 1; //為id進行賦值;strcpy(s.name,"zhnagsan");s.score = 99;struct Student s1;s1 = s; //結構體的變量之間可以賦值printf( " %d %s %f\n",s.id,s.name,s.score);return 0;
}
結構體的作用:將不相關的東西打包封裝在一起,方便使用;
注意:
? ? ? ? 結構體不可以整體賦值,因為類型不匹配;
eg:結構體的初始化;
程序:
? ? ? ? ? ? ? ? ? 注意:初始化時,次序不能顛倒;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不寫的時候,默認為0;(稱為結構體的部分初始化);
?2、結構體在內存中所占的字節數
2.1 內存對齊
? ? ? ? 將變量按照4的整數倍進行存放,用空間換取時間,提高CPU的運行效率;
2.2結構體對齊原則
?1、默認按照計算機位數對齊;64位電腦中? ?64 / 8 = 8,最終的大小必須為8的倍數;
2、從結構體的成員中查找最大字節的成員,最終以此成員大小對齊;
3、把所有的成員按照聲明依次存放入內存,偏移量? /? sizeof(成員),必須整除;
?練習:
eg:(1)將結構體中的元素逆序輸出:
? ? ? ? ? ? ? ? 用swap函數并調用;?
?(2)對結構體里面的元素進行排序:(分別用成績,名字進行排序)
程序:
二、共用體
? ? ? ? 所有的成員公用相同的內存空間;4個字節;
定義:
注意:
?????????在公共體中成員進行訪問時,僅最后一位賦值是有效的;
? ? ? ? 總是從空間的起始位置進行共享的;
? ? ? ? 所有成員的首地址相同;
eg:判斷電腦是大端存儲還是小端存儲:
三 、枚舉類型
定義:如果一個變量只有幾種可能的值,則可以定義為枚舉類型。所謂“枚舉”是指將變量的值-一列舉出來,變量的值只限于列舉出來的值的范圍內。
? ? ? ? 和整型兼容的數據類型;
?四、用typedef定義類型
給已有的數據類型,取一個別名;
int INT; //定義一個變量;
typedef int INT; //給int型取別名為INT;
第12章 位運算
一、位運算
位運算必須是整型或者與整型相兼容的數據類型,(枚舉類型可以)
????????按位與“&”:指定位清零;
????????安慰或“|”:指定位變一;
? ? ? ? 按位異或“^”:指定為翻轉,其他位不變;
????????按位取反“~”(單目運算符):按位取反:
? ? ? ? 左移“<<”:eg:p <<1————p向左移一位,最高位丟失,最低位補零;
????????左移“>>":eg:p >>1————p向右移一位,最低位丟失,最高位補零;(注意右移時是否有符號);有符號右移為算數右移,無符號右移為邏輯右移;
?eg:將p的第0位,第三位,第六位變為1;
程序: