寥寥數筆,記錄我的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[] = {};
int offset; } _reg_list[] = {};
a