標籤:運行 運算式 ext track 函數 article 運算 強制 第一個
寥寥數筆,記錄我的C語言盲點筆記,僅僅為以前經曆過。亦有誤。可交流。
?
1.邏輯運算式的使用取值 = 運算式 ? 運算式1:運算式2。比方x = y > z ??y:z
2."+,-"等邏輯運算子優先順序大於移位,移位大於邏輯運算
3.sizeof在編譯時間由編譯器完畢,對其傳入的參數不做運算處理。sizeof(i++);返回4;不會對實際的i進行操作sizeof和strlen的差別是,後者是運算時運行。返回遇到非NULL時的字元個數。
sizeof處理數組名時會統計分配的記憶體數,如a[12] = {};則sizeof(a) = 12;如a [] = "aaa",則編譯器是分配4記憶體空間存放資料,sizeof(a)= 4;
4.強制類型轉換先於+,-,故指標類型變化後,自加操作會不同;
5.invalid combination of type specifiers無效的類型進行組合。引起的原因主要是標頭檔多種資料類型define和typedef引起了錯誤。
| typedef是一個類型的重定義 不是宏的值的重定義 僅僅能用於類型的替換 |
。主要在編譯階段,須要帶有分號
define是宏定義,主要在預先處理階段,不太適合做類型轉換,結尾分號會被帶入宏替換比方先定義#define Uint8 unsigned char?typedef xdc_Uint8 Uint8;這就進行了宏替換為:typedef xdc_unsigned char Uint8;從而導致了類型結合無效的現象。故define宏是預先處理的替換,而typedef是做到資料類型的真正轉換與定義。宏最好不要進行typedef的轉換!!
。。
資料類型在多處定義時,注意不要出現上述情況
6.printf輸出%號,須要使用printf("%%\n");來輸出
7.邏輯或與運算或要切記:
|和||,以及&和&&的使用。
8.取非!
和~的運算優先順序》 + -;
9 strcpy是將源地址開始到\0結束的位元組數拷貝到目的地址。
strlen統計的從源地址到遇到\0前的位元組數。不算如\0
10.某一位置1 A |= (1 << 5);某一位置0 A &= ?~(1 << 5);某一位取反 A ^= (1 << 5); 與1異或取反。
11. union進行賦值時須要使用a.b操作
12、0x%08x,輸出16進位數要達到8位,不然在前面補0
14.棧幀包含還有一幀須要的函數參數。返回的pc地址以及當前幀的ebp.
15. 結構體對齊struct test{char x1;short x2;float x3;char x4;};因為編譯器預設情況下會對這個struct作常態範圍(有人說“自然對界”我認為邊界更順口)對齊,結 構的第一個成員x1,其位移地址為0,佔領了第1個位元組。第二個成員x2為short類型,其起始地址必須2位元組對界。因此,編譯器在x2和x1之間填充 了一個空位元組。
結構的第三個成員x3和第四個成員x4恰好落在其常態範圍地址上,在它們前面不須要額外的填充位元組。在test結構中,成員x3要求4位元組 對界,是該結構全部成員中要求的最大邊界單元。因而test結構的自然對界條件為4位元組,編譯器在成員x4後面填充了3個空位元組。整個結構所佔領空間為 12位元組。
16.?memset(),是將n個位元組都設定為傳入的一個位元組如memset(a, 0, 100);memcpy(dst, src, n);將src開始的n個位元組copy到目的上去。
17.多進程引用的動態連結程式庫中的全域變數問題?因為不同進程間是獨立的。有自己的text和data,而全域位於資料區段,故不會存在競爭的現象。
18.struct的一種結構體數組申明與定義的方法。static struct {?? char *name;
? ? int offset;??} _reg_list[] = {};
?
a
?
c語言編寫經驗逐步積累4