c语言编写经验逐步积累3
寥寥數筆。記錄我的C語言盲點筆記,僅僅為以前經歷過。亦有誤,可交流。
?
1.typedef來定義一個函數指針類型的方法,定義一個新的函數指針類型。:建立一個類型別名的方法非常easy,在傳統的變量聲明表達式里用類型名替代變量名,然后把keywordtypedef加在該語句的開頭”。typedef int (*PFUN)(): 定義PFUN這個函數指針類型,由編譯器自己主動來完畢,比方PFUN pfun;定義了一個函數指針,相似于抽象出一種新的變量類型。typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );
pTaskEventHandlerFn tasksArr[];//申明函數指針的數組
使用typedef將一個類型名字替代原先申明時的變量名。然后類型名能夠用來申明定義變量。
2.有初始化的數組定義能夠省略方括號里的數組大小。
比如,以下的代碼中數組定義為5個元素:
int a[]={2,4,6,8,10};
編譯時必須知道數組的大小。
通常,聲明數組時方括號內的數字決定了數組的大小。
有初始化的數組定義又省略方括號里的數組大小時。編譯器統計花括號之間的元素個數,以求出數組的大小。
比如,以下的代碼產生同樣的結果:
static int a1[5]={1,2。3,4,5};
static int a2[]={1。2。3,4,5};
3.for(a;b;c){e}運行順序:先進行a, 然后是b, 運行e, 在運行c.進一步運行b,運行e,c.直到b不再滿足退出循環。
4.union數據類型。內存是重疊的,全然一樣typedef union {
? uint32 time32;
? uint16 time16[2];
? uint8 time8[4];
} osalTime_t;
對time32的賦值后,訪問其它類型時依然是原來的內存。
三個成員占領一樣的數據空間。起始地址都是一樣的,一旦一個成員數值變化就會出現其它成員取值也發生變化
5.inline內聯函數總結內聯函數具有代碼量小且直接編譯進可運行文件里,不進行call調用,也就是在不同的文件的函數假設調用內聯函數。則不同的函數都會出現該內聯函數的可運行代碼。可是,假設不反復調用的話。內聯函數帶來的優點就是運行更加高速,無需再call,以及函數參數的出入棧SP。保護棧幀,跳出函數,清空棧幀等各種耗時。起到高速運行的效果。故內聯函數的代碼量都較小。總之是以添加運行文件大小來獲取程序運行速度的提高。
6.(int *)0,表示指向一個整形的地址。地址值為0。即空指針所在的地方,該處一般不同意寫操作,以免破壞系統。但能夠讀取。
7.假設一個函數要被其它文件里函數使用,定義時加externkeyword。在沒有加extern和statickeyword時。一般編譯器會默認是extern類型的,因此你在其它函數里調用也能夠使用。
8.結構體之offsetof宏具體解析 ,#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) (include/linux/stddef.h)
9.32位機讀取一個字節,實際底層的匯編做了進一步的處理。比方讀取一個字節。實際返回的是一個32位,經過屏蔽移位取得你要的地址所在的數。寫入時也一樣。會先保持4字節其它字節不變,然后單獨把要寫入的字節做改變。由編譯器依據你的數據類型來完畢實際的實現。32字節的讀取最為高效。
10.中斷發生時,未完畢服務程序的處理時。將會忽略掛起Pending,優先級高的中斷能夠獲取中斷使用權。還有一個同樣的中斷發生,直到當前中斷處理完畢,才同意再次中斷進入。
11.switch case誤區。switch case往往對不同的命令進行分類操作,可是假設出現遇到相應case做完處理后,假設沒有遇到break就會接著默認運行以下的case內容(不再去case,由于僅僅有剛進入switch才會去匹配case,已經進入后,case匹配忽略)。直到遇到帶break后為止跳出case,否則一直運行完。
由于僅僅在第一次才做switch推斷跳到相應的內容去運行。
所以,好的程序基本是須要break的。可是有些情況(多個情況相應處理的內容要一樣,即前面的幾個類型能夠不做處理,不須要break。直到最后一個做處理,實現多個類型運行同樣的功能,但不添加代碼量,更直接)。
總之,僅僅有在第一次才做推斷與選擇。進入以后就是安裝順序運行,不break會一直運行到switch結束12 C語言中的感嘆號。邏輯取反。不同于~的按位取反!
=:表示不等于。。(1)表示為0,!
(0)表示為1,有取反之意,但僅僅能用在0和1上面。不等于0的會變為0,等于0的變為1
13.C語言+和<<遇到的一個BUG問題。在這里+的優先級高于<<左右移。所以比方a<<8+b,實際是從右往左賦值,8+b相加后來移動a,所以不實現兩個字節合并為一個16位的數據。故要加(a<<8)+b才干實現本來的意圖。這個誤區須要注意。
14.:#define PINMUX0_31_28 0x00000001u,0x00000001ULu表示無符號,UL unsigned long int 32位,unsigned long long 64位
15數組指針和指針數組的差別數組指針。為一個指針,int (*a)[10];指向一個數組,相似于函數指針指針數組。為一個數組。int* a[10];相似于指針函數,返回的是一個指針。
16.window以下絕對路徑的文件須要用雙斜杠來表示\\
17 printf("c=%#x\n",c);什么意思?%#表示的輸出提示方式,假設是8進制,在前面加0,假設是十進制。不加不論什么字符。假設是十六進制,會自己主動加上0x
18?靜態變量在編譯的時候初始化,所以初值必須是常量(能夠是常數、定義成常數的宏、C++編譯器中用const修飾的常量),靜態變量不能用變量賦初始值,但在運行時是能夠用變量賦值的。
19 assert函數,用于推斷是否為真,滿足就繼續運行,不然直接終止程序的運行20.做到4個字節對齊,使用例如以下方式:((CSL_CacheRegsOvly)CSL_CACHE_REGS)->L1DIWC? = ((byteCnt+3)>>2);字節數不為4的倍數時。須要多保留一個字的數量,故加3,1+3,2+3,3+3.4字節對齊的方式。獲得4字節對齊后的字節數字:byte_num = (byte + 3) & 0xfc; 這樣字節數必為4的倍數。
21 for循環中假設break,則i++不再運行。
22.temp = (temp+1)&7.表示temp從0到7變化,循環。
相似于temp=8時賦值回0.
23.unsigned char *p;unsigned char a[];p=a;這樣正確。
unsigned int p1= a;錯誤,由于是指針類型賦值給了整形的數據類型,類型不匹配。unsigned char * p[10]:申明一個指針數組,10個指針,每一個指針指向char類型的空間。unsigned char (*p)[10]申明一個數組指針。指向含有10個char類型的空間。指針維護一個10的空間。偏移1加10個空間。
24.多個if會進行分支處理,分別推斷后進行是否運行。而if 和多個else if等配合時。一旦出現某個滿足條件時,不再運行以下的else if的推斷,確保僅僅進入一個分支。
25.char a[3][4]. char **p =a;出現編譯錯誤,類型不匹配不能賦值由于a表示的是一個指向一維數組的指針,即char (*a)[3]這個類型.a+1是會偏移3個單位。p是一個指針的指針,稱為二級指針。所以兩者類型不一樣。
26.數組名取地址在《C和指針》p142中說到,在以下兩中場合下,數組名并非用指針常量來表示。就是當數組名作為sizeof操作符和單目操作符&的操作數時。
sizeof返回整個數組的長度,而不是指向數組的指針的長度。?取一個數組名的地址所產生的是一個指向數組的指針,而不是一個指向某個指針常量的指針。
所以&a后返回的指針便是指向數組的指針(相似于(*p)[3]),跟a(一個指向a[0]元素的指針)在指針的類型上是有差別的。&a+1是偏移一個數組sizeof大小的尺寸,由于&a是指向數組指針的地址,是一個數值指針。
27. 二維數組名不能簡單的理解為2級指針,而是要從數組的系統結構上去了解。個人覺得二維數組名事實上就是一個指針,可是他指向的數據類型是一維數組的這么個數據類型。即數值指針。事實上能夠理解為功能和二維數組名相似。至于數據訪問,全然是編譯器來自己主動完畢棧區的訪問。
28.數值名不能改動,是由于在棧區域內已經定好了ebp,基地址。
訪 問數組都是基于這個ebp來進行的。所以。給數組名賦值變得沒有意義,肯定不同意改動ebp的。
所以在編譯階段就報錯。
29.fseek和發tell配合來完畢確定文件大小的過程。fseek(fPtr,0,SEEK_END);file_size = ftell(fPtr);fseek(fPtr,0,SEEK_SET)。位置指針復位進行讀寫操作
30.兩數交換不使用第三個緩沖區。三條代碼的方法:主要通過運算符來實現。
A = A^B;B = A^B;A = B^A;
A = A+B;B = A-B;A = A-B;
?
轉載于:https://www.cnblogs.com/mqxnongmin/p/10812520.html
總結
以上是生活随笔為你收集整理的c语言编写经验逐步积累3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket认证客户端链接合法性
- 下一篇: BZOJ 3244: [Noi2013]