嵌入式C語言 學習筆記

2021-10-18 19:27:40 字數 3366 閱讀 1682

一、位運算

符號運算規則

&(與)

兩個位都為1時,結果才為1(從真假方面看,只有當兩個位都為真時,結果才為真)

\(或)

兩個位都為0時,結果才為0 (從真假方面看,如果兩個運算物件中相應的乙個位為真或者兩個位都為真,那麼結果為真)

^(異或)

兩個位相同為0,相異為1(從真假方面看,如果兩個運算物件中相應的乙個位為真且不是兩個位同為1,那麼結果為真)

~(取反)

0變1,1變0

<< (左移)

各二進位全部左移若干位,高位丟棄,低位補0

>>(右移)

各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)

掌握了這六種操作否的用法,c語言的位操作就差不多了。這六種操作符的解釋如下:

1、 & 按位與: 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。

例如: 1&1 = 1 1&0 = 0 0&1 = 0 0&0 = 0

2、| 按位或:兩個相應的二進位制位中只要有乙個為1,該位的結果值為1。

例如: 1|1 = 1 0|1 = 1 1|0 = 1 0|0 = 0

3、^ 按位異或: 若參加運算的兩個二進位制位值相同則為0,否則為1。

例如: 1^1 = 0 0^1 = 1 1^0 = 1 0^0 = 0

4、~ 取反: 對乙個二進位制數按位取反,即將0變1,將1變0。

例如: 1! = 0 0! = 1

5、<< 左移:用來將乙個數的各二進位制位全部左移n位,右補0。

例如: 00001100 << 2 = 00110000

6、>> 右移:將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數,高位補0。

例如: 00001100 >> 2 = 00000011

二、靜態變數(static)

static最主要有以下兩點用途:

1、讓乙個變數長期有效,而不管其是在什麼地方被申明。

例如:

int

fun1()

fun1不管在什麼地方被呼叫,當函式退出後,s_value最後的值將一直會被系統儲存,下次s_value再被用到時,也即當fun1()再次被呼叫時,s_value初始值將是最近被儲存過的值(請注意s_value初始化操作只會被執行一次,即上述s_value =0 這個語句)。

2、避免多個檔案使用了相同的變數名而導致衝突 。

在c語言中static的作用如下:

第一、在修飾變數的時候,static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束以後才釋放;

第二、static修飾全域性變數的時候,這個全域性變數只能在本檔案中訪問,不能在其它檔案中訪問,即便是extern外部宣告也不可以;

第三、static修飾乙個函式,則這個函式的只能在本檔案中呼叫,不能被其他檔案呼叫。static修飾的區域性變數存放在全域性資料區的靜態變數區。初始化的時候自動初始化為0。

static

int st_val;

//靜態全域性變數 -- 靜態儲存區

int ex_val;

//全域性變數 -- 靜態儲存區int main(void)

}

c語言的作用域不僅描述了識別符號的可訪問的區域,其實也規定了變數的儲存區域,在檔案作用域的變數st_val和ex_val被分配到靜態儲存區,其中static關鍵字主要限定變數能否被其它檔案訪問,而**塊作用域中的變數a, ptr和local_st_val則要根據型別的不同,分配到不同的區域,其中a是區域性變數,被分配到棧中,ptr作為指標,由malloc分配空間,因此定義在堆中,而local_st_val則被關鍵字限定,表示分配到靜態儲存區,這裡就涉及到重要知識點,static在檔案作用域和**塊作用域的意義是不同的:在檔案作用域用於限定函式和變數的外部鏈結性(能否被其它檔案訪問), 在**塊作用域則用於將變數分配到靜態儲存區。

靜態變數常用使用方式:

定義區域性變數:用static宣告後的區域性變數的值在函式呼叫結束後不消失而保持原值,其占用的是靜態儲存區,所以即其占用的儲存單元不釋放。典型應用是用static變數求階乘n!。

// 求階乘 n!

intfac

(int

)main()

printf

("輸出%d!= %f ",n,sum) ;

}

三、extern變數宣告

c 語言中 extern 可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。這裡面要注意,對於 extern 申明變數可以多次,但定義只有一次。

例如:

extern u16 usart_rx_sta;
這個語句是申明 usart_rx_sta 變數在其他檔案中已經定義了,在這裡要使用到。

四、關鍵字const

const

int a;

//整型常數

intconst a;

//整型常數

const

int*a;

//指向整型常數的指標(整型常數不能修改,指標可以)

int*

const a;

//指向整型數得常指標(指標指向的整型數可以修改,指標不能修改)

intconst

* a const

;//指向整型常數的常指標(指標指向的整型數不能修改,同時指標也不能修改)

前兩個的作用是一樣,a是乙個常整型數。第三個意味著a是乙個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思 a是乙個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後乙個意味著a是乙個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。

const關鍵字注意:

1、const關鍵字修飾的變數可以認為有唯讀屬性,但它絕不與常量劃等號。

例如:

const

int i=5;

int j=0;

... i=j;

//非法,導致編譯錯誤,因為只能被讀

j=i;

//合法

2、const關鍵字修飾的變數在宣告時必須進行初始化。

例如:

const

int i=5;

//合法

const

int j;

//非法,導致編譯錯誤

3、c標準中,const定義的常量是全域性的。

嵌入式c語言 學習筆記

最普通的指標 int a 呼叫形式 1 a a指向的物件的位址 2 a a指向的物件的值 3 a a自身的位址 常用來作為引數,呼叫陣列,加上乙個說明陣列的長度的,從而獲取不定大小的陣列 第二種 int a n 指標陣列,包含n個整型指標 對應地 int a n 陣列指標,指向大小為n的陣列 嵌入式...

嵌入式C語言學習筆記2

1.資料型別基本型別 整型 signed short int long long long 考慮整數長度?unsigned 字元型 char 有符號,無符號 實型 float double 列舉型 enum 1 bool布林型別 邏輯型別 true false 真和假 例一 int main els...

嵌入式C語言學習(二)

c語音基礎 1.函式 形參與實參 函式呼叫 區域性變數和全域性變數 extern 動態儲存變數和靜態儲存變數 static 內部函式 定義加static 和外部函式 定義和使用時加extern 2.預編譯處理 2.1巨集定義 define 識別符號 字串 巨集名用大寫 巨集定義不是語句,不加分號 巨...