c語言編寫經驗逐步積累4

weixin_33816946發表於2018-01-15

寥寥數筆,記錄我的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




 

相關文章