嵌入式C學習

2021-10-19 05:31:51 字數 3296 閱讀 8501

位域函式指標

定義方式

結構體做函式引數傳遞有三種方式:

(1)用結構體的單個成員作為函式引數,向函式傳遞結構體的單個成員(屬於傳值呼叫,不會影響相應的實參結構體的值),分為值傳遞和位址傳遞。

(2)用結構體變數做函式引數,向函式傳遞結構體完整結構(屬於傳值呼叫,不會影響相應的實參結構體的值),屬於位址傳遞。

(3)用結構體指標或結構體陣列作函式引數屬於模擬按引用呼叫,會影響相應的實參結構體的值,向函式傳遞結構體位址,因為僅複製結構體首位址乙個值給被調函式,相對於第二種方式,這種傳遞效率更高,屬於值傳遞。

傳遞結構體變數:

#include

#include

#define format "%d\n%s\n%f\n%f\n%f\n"

struct student

;void

change

(struct student stu )

;int

main()

void

change

(struct student stu)

最終輸出的值未改變

"font-family:arial black;font-size:12px;"

>#include

#include

#define format "%d\n%s\n%f\n%f\n%f\n"

struct student

;void

change

(struct student* stu )

;int

main()

void

change

(struct student* p)

<

/span>

通過位址傳遞修改了結構體內的資料

在c語言中檔案包含是指乙個原始檔可以將另乙個原始檔的全部內容包含進來。該命令的作用是在預編譯時,將指定原始檔的內容複製到當前檔案中。檔案包含是c語言預處理命令三個內容之一。

檔案包含有兩種格式,分別是:#include 「file」 和 #include

1.使用雙引號,系統首先到當前目錄下查詢被包含的檔案,如果沒找到,再到系統指定的"包含檔案目錄"(由使用者在配置環境時設定)去找。

2.使用尖括號:直接到系統指定的"包含檔案目錄"去查詢。

例如:檔案f1.c

#define pi 3.1415926

#define r 3

#define s pi*r*r

檔案f2.c

#include

"f1.c"

#include

"stdio.h"

main()

位元組序,簡單來說,就是指的超過乙個位元組的資料型別在記憶體中儲存的順序

大端位元組序:高位位元組資料存放在低位址處,低位資料存放在高位址處;這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小段位元組序:高位位元組資料存放在高位址處,低位資料存放在低位址處;這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

網路位元組序:tcp/ip協議傳輸資料時,位元組序預設大端。

位段,c語言允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單位的成員稱為「位段」或稱「位域」( bit field) 。利用位段能夠用較少的位數儲存資料。

如果程式的結構中包含多個開關量,只有 true/false 變數,如下:

struct

status;

這種結構需要 8 位元組的記憶體空間,但在實際上,在每個變數中,我們只儲存 0 或 1。在這種情況下,c 語言提供了一種更好的利用記憶體空間的方式。如果您在結構內使用這樣的變數,您可以定義變數的寬度來告訴編譯器,您將只使用這些位元組。例如,上面的結構可以重寫成:

struct

status;

現在,上面的結構中,status 變數將占用 4 個位元組的記憶體空間,但是只有 2 位被用來儲存值。如果您用了 32 個變數,每乙個變數寬度為 1 位,那麼 status 結構將使用 4 個位元組,但只要您再多用乙個變數,如果使用了 33 個變數,那麼它將分配記憶體的下一段來儲存第 33 個變數,這個時候就開始使用 8 個位元組。讓我們看看下面的例項來理解這個概念:

#include

#include

/* 定義簡單的結構 */

struct

status1;

/* 定義位域結構 */

struct

status2;

intmain()

當上面的**被編譯和執行時,它會產生下列結果:

memory size occupied by status1 :

8memory size occupied by status2 :

4

在結構內宣告位域的形式如下:

struct

;

下面是有關位域中變數元素的描述:

元素描述

type

只能為 int(整型),unsigned int(無符號整型),signed int(有符號整型) 三種型別,決定了如何解釋位域的值。

member_name

位域的名稱。

width

位域中位的數量。寬度必須小於或等於指定型別的位寬度。

帶有預定義寬度的變數被稱為位域。位域可以儲存多於 1 位的數。

如果在程式中定義了乙個函式,那麼在編譯時系統就會為這個函式**分配一段儲存空間,這段儲存空間的首位址稱為這個函式的位址。而且函式名表示的就是這個位址。既然是位址我們就可以定義乙個指標變數來存放,這個指標變數就叫作函式指標變數,簡稱函式指標。

函式返回值型別 (* 指標變數名) (函式引數列表);

注:「函式返回值型別」表示該指標變數可以指向具有什麼返回值型別的函式;「函式引數列表」表示該指標變數可以指向具有什麼引數列表的函式。這個引數列表中只需要寫函式的引數型別即可。

如何用函式指標呼叫函式

int

func

(int x)

;/*宣告乙個函式*/

int(

*p)(

int x)

;/*定義乙個函式指標*/

p = func;

/*將func函式的首位址賦給指標變數p*/

嵌入式C學習

靜態變數與靜態函式 extern變數 關鍵字const和巨集定義define 程式中所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。常見的位運算有 and運算 or運算 xor運算 not運算 shl運算 和shr運算 and運算通常用於二進位制...

嵌入式學習(二) 嵌入式系統C 語言

1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...

嵌入式學習

1 c 語言 第二版譚浩強。2 資料結構 c語言版。3 實用 c 程式設計 4 學習51 微控制器,加深對中斷的理解。5 學習 arm微控制器。1 細讀 arm微控制器基礎與實戰 周立功編寫。2 細讀相關晶元的原版英文文件。如 arm920te.pdf s3c2410 1.2.pdf。6 學習uco...