C語言之關鍵字結構體共用體位運算

2021-08-14 20:22:01 字數 4847 閱讀 8734

一、關鍵字:

①const:修飾變數,希望將這個變數變成「常量」!

用法:記住一句話:

如果想知道const是修飾誰的,從const開始往右看!看你是先遇到誰,如果先遇到*p,那就是*p,那就是*p

不能夠被改變!如果是先遇到p,那麼p就不能夠被改變!【近水樓台先得月】

1、修飾普通變數;

const無論是放在資料型別的前面或者是後面,都是將變數修飾為常量,不能夠改變變數的值!

int const num  = 10;

const int num = 10;

上面這兩個是等價的!

2、和指標變數結合起來使用:

i、p;

ii、*p;

注意的一點:

int a = 10;

int const *p = &a;

//*p不能夠被改變!通過指標變數不能間接改變a的值!但是可以通過

//變數本身來改變(a);

a = 12;

//這行是不會錯的!

*p = 11;

//報錯!

掌握的是:

1、給你乙個表示式,能夠看懂修飾什麼不變!

2、根據自己的意願來用const定義相應的變數不變!

int const  a = 12;

//修飾a不能夠改變!

int *p = (int *)&a;

//a = 18;

*p = 18;

printf("a = %d\n",a);

②static:靜態變數!

作用:1、修飾區域性變數:延長區域性變數的生命週期;

2、如果修飾全域性變數、函式;具有「隱藏」的功能,保證函式和全域性變數只能夠在本檔案中使用(.c),

不能夠在其他的檔案中使用,也就是不能夠在其他的.c檔案中使用!

小結:static可以用來修飾區域性變數、全域性變數和函式;

修飾區域性變數的時候,。。。。

修飾全域性變數和函式的時候,。。。。

static具有「隱藏」的功能!

③volatile:防止編譯器優化處理!

volatile int temp = 10;

提醒編譯器,volatile後面修飾的變數隨時都可能改變!要求編譯器將編譯後的程式,每次讀取變數資料的

時候,直接從變數的位址裡面去讀取!而不是從暫存器裡面去讀取!===》暫存器裡面的數值和位址裡面的數值

不一樣!【多執行緒,中斷程式】

④register:有register修飾的變數,是暫存器變數!

告訴編譯器,register修飾的變數會經常呼叫,請求編譯器盡可能地把register修飾的變數儲存到cpu內部

的暫存器上!而不是通過記憶體取位址來呼叫!==》提高效率!

注意點:

1、對變數的操作,因為可能不是儲存到記憶體裡面,所以就不能用&來對變數進行操作;

2、變數的型別能夠被cpu所接受!register修飾的變數 <= int 型的,但是有些機器也可以是浮點型;

3、不能夠修飾全域性變數,函式!可以修飾區域性變數!

掌握:1、是什麼,有什麼特性?

2、可以修飾什麼,不能修飾什麼?

3、能修飾什麼的時候,。。。注意點是什麼?

⑤extern:外部宣告;

1、函式定義的時候,在前面加上extern表明這個函式是外部函式,可以在其他的檔案中呼叫!如果不加,

預設為是外部函式,可以在其他的檔案中呼叫!====》static相區別;

2、在呼叫的地方用extern進行外部宣告,表明這個函式在別的檔案中定義了!如果不用extern宣告的話

會有警告!【最好宣告!】

define和typedef的區別:

共同點:都可以對資料型別進行重新命名!

1、#define是在預處理階段就處理的,typedef不是;

2、#define dint int *

typedef int* tint;

dint a,b;

//a:int *

b:int

define只是單純的替換!

tint a,b;

//a:int *

b:int *

3、#define可以自由組合,而typedef不可以;

#define dint int

typedef int tint;

unsigned dint a;

unsigned tint b;

4、typedef可以組建新的資料型別的;

typedef struct node

node;

node == struct node

二、結構體:

現在的需求:儲存乙個人的姓名,年齡,身高,家庭住址!

===》引入了結構體這個概念!

//下面這個就是結構體型別的封裝!

struct(關鍵字) 結構體型別的名字

;//分號結尾!

結構體有什麼操作:

1、定義結構體變數;====》之前,要定義乙個結構體型別!(結構體型別根據自己的需要自己進行封裝的)

int num; 

結構體型別  名字;

2、初始化;

3、引用結構體變數裡面的元素:

如果定義的是結構體變數,則用.號運算子===》理解為「的」

如果定義的是結構體指標變數,則用->運算子;

4、賦值;

補充:『\0』和ascii 0一樣的,都表示「不顯示」!

『0』:形狀看起來和0是一樣的這個字元;

數字0:表示的是數字!1 2 3 4 123

結構體型別所佔位元組大小:

sizeof(int);

sizeof(int *);

計算方法:

簡單:分配單位:

1、在結構體型別中,從成員列表中找出資料型別所佔位元組最大的乙個===》命名為a

2、將a和系統預設的對齊引數b(4個位元組),相比較,取出a和b中的較小的乙個為分配單位!

2、如果結構體型別a裡面巢狀結構體變數b的時候,結構體型別a所佔的位元組大小,不以結構體b的資料型別

為單位,而是將b裡面的資料型別單獨拿出來,和a裡面其他的資料型別比較!

學習步驟:

1、最基本的:

2、帶陣列;

3、結構體資料型別裡面巢狀結構體變數;

對齊引數:

1、變數本身的對齊引數,可以理解為變數所佔的位元組;(int temp)

2、系統預設的對齊引數,我們這裡預設的4個位元組!

結構體和陣列有什麼優劣:

struct node

;共用體:

//封裝型別;

union 共用體的名字

;定義的方法和結構體是一樣的;

union student s;

共用體只是對同一塊記憶體空間的不同的解析方式!位元組大小就是裡面最大的資料型別的位元組大小!

==》在共用體裡面是沒有位元組對齊概念的!

大小端位元組序:

short temp = 0x1122;

//temp是兩個位元組;

怎麼測試系統是小端還是大端儲存的?

方法:1、採用共用體的方式:

2、指標的方式:

列舉型別:

#define max 10

什麼叫列舉:乙個乙個地列舉!

此類繁多,不勝列舉!

怎麼用?

//封裝乙個列舉型別

enum demo

//列舉型別的名字

;利用列舉型別來定義列舉變數

enum demo demo;

總結:1、列舉型別中的元素都是整型常量,不是變數!

2、列舉型別裡面的元素,一開始預設為0,並且依次加1;

3、我們可以規定列舉型別中的元素的大小:

enum test

;巨集定義和列舉的區別:

1、列舉是有型別的,巨集定義沒有型別;

2、列舉比巨集的功能要少,只能表示整型常量,而巨集定義還有引數的巨集定義呢;

3、列舉是編譯階段進行處理,巨集定義是在預處理階段;

4、當需要有大量的巨集定義的時候,可以用列舉來代替!

位運算:位與(&) 位或(|) 位抑或(^) 取反(~)

1、&:只有有0的都是1,同時為1的才是1;

0 & 0 = 0;

0 & 1 = 0;

1 & 1 = 1;

3 & 5 = 

3 = 0011

5 = 0101

& = 0001

==》1

按位與(&)  邏輯與(&&) 要能夠區分!

2、|:有1的就是1,全為0的就是0;

0 | 0 = 0;

0 | 1 = 1;

1 | 1 = 1;

3 | 5 = 0111 = 7;

按位或(|)和邏輯或(||)

3、^:如果兩個同就進行「位或」操作!

0 ^ 0 = 0;

0 ^ 1 = 1;

1 ^ 1 = 0;

5、~:0換成1,1換成0;

~0 = 1;

~1 = 0;

位取反 和 邏輯非相區分!

6、左移:<<

5 = 0000 0101

5 << 2 = 0001 0100 = 20;

首先左移1位:000 0 1010 = 10;

再左移1位:0001 0100 = 20;

左移n位:擴大了2 ^ n;   x << n =》x * 2^n;

7、右移:>>

5 = 0000 0101 

右移一位:0000 0010 = 2 = 5 / 2;

再右移一位:00000 001 = 1;

右移n位:x >> n ===》x /(z^n);

一、將特定位清零的話:& 0;

二,將特定位置為1的話:| 1;

三、將特定位取反的話:~

C語言之關鍵字

基本資料型別 short int long float double char unsigned signed 8個 復合資料型別 struct union enum 3個 語句結構 if esle do while for switch case default break continue go...

C語言之共用體

c語言共用體,又叫聯合體,使用關鍵字union定義。共用體使用同一儲存單元存放不同型別的變數。基本形式格式 union 共用體名 變數表列 具體有四種方式 union mydatadata union mydata union mydata data typedef union mydata dat...

C語言之關鍵字typedef

c語言提供了乙個 型別定義 的功能 typedef 用此來建立新的資料型別名。需要強調的是,從任何意義上來講,typedef 的宣告並沒有建立乙個新的型別,它只是為某個已經存在的型別增加乙個新的名稱而已。typedef 宣告也沒有增加任何新的語義,通過這種方式宣告的變數與通過普通方式宣告的變數具有完...