準備再深入學習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的陣列 嵌入式...