一、關鍵字:
①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 宣告也沒有增加任何新的語義,通過這種方式宣告的變數與通過普通方式宣告的變數具有完...