19 9 21 嵌入式C語言學習

2021-09-27 07:49:24 字數 3530 閱讀 2633

準備再深入學習c語言為了更好的了解嵌入式程式設計 ,為後續的深入學習打下基礎,目前就自己感覺而言linux的學習不是走一條線,而是多線並進。

c語言的學習的是必須掌握的,經常做題已經對裡面程式設計語法的熟悉

linux是作業系統的學習,了解其內部的執行原理,核心,以及一些命令的使用

要一直走在學習的路上才能發現自己走的路對不對,才能及時調整,如果不走這條路永遠只能停在原地,連錯誤的機會都沒有。

1.用預處理指令#define宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)

#define 巨集名 巨集體

巨集名:大寫字母表示

#define second_of_year 123456

#define second_of_year (365243600)

que1:會考慮到一種是直接把值算出來就賦值給巨集名,防止每次呼叫cpu都去對這個算式進行運算,但是這種擔心是多餘的。

上面第一種是數值常量,第二鍾是常量表示式。在編譯過程中直接就把值算出來,並賦值給巨集體

tip:巨集體上都要加括號

為了防止巨集體數值過大,後面加上限制符:

#define second_of_year (365243600)ull:unsigned long,代表無符號長整形,限制為4個位元組,而且對於本題秒數為整數,還必須是無符號形的

8bit: 0-255 256個數

16bit: 0-65535 655356個數

巨集體的實現

(1)365243600

(2)直接求出該數值

資料宣告問題

2.用變數a給出下面的定義

a)乙個整型數

int a;

b)乙個指向整型數的指標

int *a

看到要定義指標的 *a

在看是什麼型式的

c)乙個指向指標的指標,它指向的指標是指向乙個整形數

int **a;

int * *a; 左邊的 修飾右邊的a

d)乙個有10個整型數的陣列

int  a[10];

cpu在識別時,看到右邊的方框,就是陣列標籤。在看內部的數字告訴分配多少個陣列空間

cpu識別時,右邊的優先順序高於左邊,先看右邊有無方框,識別為是否是陣列,在看左邊的星號,看是否是指標*

e)乙個有10個指標的陣列,該指標是指向乙個整型數的

int *a[10];

同樣先看右邊,是,所以確定a的陣列標籤,在看左邊*,則為乙個存指標的陣列
f)乙個指向有10個整型數陣列的指標

int (*a)[10];
int [10] *a  //a是指標必須要是個*

然後才是[10]代表有10個這樣的陣列

所以就要對其先進行限定,int (*a)[10];

括號內,先限定其為指標,然後在看方框,知道這個指標是指向陣列的。

g)乙個指向函式的指標,該函式有乙個整形引數並返回乙個整型數

int (*main)(int a)
如果寫成 int *main(int a)  那麼根據函式識別優先順序的判定,先判斷了右邊的園括弧

則先定義其為函式,而再看左邊的*號時候,就是返回值了.

則 int *main(int a) 代表的是乙個返回值為整形指標的函式,而不是乙個指向函式返回值為整形值的指標。

h)乙個有10個指標的陣列,該指標指向乙個函式,該函式有乙個整形引數並返回乙個整型數

int (*a[10])(int)

這裡可以看出對於,乙個函式的整型引數可以不用給出名字,給出整型符號也是可以的。

修飾符

對記憶體資源存放位置的限定

資源屬性中位置的限定

關鍵字static的作用是什麼? static:靜態

1.修飾區域性變數

預設區域性變數 在 棧空間內存在,函式一返回,棧空間就被釋放了,生存期短。

區域性靜態化,區域性變數 在 靜態資料段儲存,生存期變長。

2.修飾全域性變數

對於全域性變數來說,放置的位置不會有變化都在靜態資料段中儲存

作用是防止重新命名

3.修飾全域性函式

作用是防止重新命名

防止不同檔案訪問時,有相同名字時造成的問題

比如有3個.c檔案,乙個是  主函式的,另外兩個是功能函式

兩個函式都定義全域性變數 int a;

則如果主要函式呼叫時候就會出現問題,

所以加上static後,則該變數只在本檔案內有效,不能被其他檔案呼叫

在多檔案程式中有用,多人合作寫檔案時,非常有用

全域性和區域性的概念:

在乙個檔案內,在 {} 外部的就為全域性,內部的就是區域性

int fun()

int main()

fun()來說就是全域性

關鍵字const有什麼含意

c:唯讀,建議性, 不具備強制性 不等於乙個常量

通過越界等一些方法,可以更改他的值

關鍵字volatile的含意?據三個例子

防止c語言編譯器的優化。

他修飾的變數,該變數的修改 可能通過第三方來修改

當引入執行緒,中斷概念時,就會涉及到第三方

位操作

嵌入式系統總是要對使用者對變數或暫存器進行位操作。給定乙個整形變數a,寫兩段**,第乙個設定a的bit3,第二個清楚a的bit3。以上兩個操作中,保持其他位不變

一般意義上,設定(select)就是置1

清除(clear)就是置0

unsgined int a; //這裡的的a代表的不是數學意義,而是電路板上的物理意義,所以要使用無符號整形

a |= (1<<3); //bit3 是第四位,這裡要注意

a&=~(1<<3);

訪問固定記憶體位置

在某工程中,要求設定一絕對位址0x67a9的整形變數的值位0xaa66。編譯器是乙個純粹的ansi編譯器,寫**去完成這一任務

第一鐘

int *p =(int *)0x67a9;/ 代表的是絕對位址的拷貝 (int *)0x67a9 強制把67a9轉換為位址

p[0] = 0xaa66; //p[0]就是0x67a9內部放的值

第二種

*((int *)0x67a9)=0xaa66;

(int*)0x67a9 這一步是強轉0x67a9為位址,不然cpu只能識別它為乙個數字

*(int*)0x67a9 ) 這一步是取內容,直接對0x67a9這個內容進行更改,簡潔

???

((void(*)(void))0x67a9)();

轉換為函式的

嵌入式C語言學習(二)

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

嵌入式C語言 學習筆記

一 位運算 符號運算規則 與 兩個位都為1時,結果才為1 從真假方面看,只有當兩個位都為真時,結果才為真 或 兩個位都為0時,結果才為0 從真假方面看,如果兩個運算物件中相應的乙個位為真或者兩個位都為真,那麼結果為真 異或 兩個位相同為0,相異為1 從真假方面看,如果兩個運算物件中相應的乙個位為真且...

嵌入式c語言 學習筆記

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