-
union的作用是讓不同的類型的變量共享同一個內存地址
查看全部 -
宏的好處在于可以不指定數據類型,因為宏是不管語法的
查看全部 -
宏函數
#define ADD(a,b)? (a+b) ? (要盡量加上括號,防止語法錯誤,先后循序不一致。)
查看全部 -
預處理第二件事:宏替換
#define 生成宏????R 宏的名字?????10 宏的內容(作用效果,從本行開始)
此時視10為字符(單純的字符串替換,不考慮語法的問題)
查看全部 -
預處理第一件事,展開頭文件
然后是宏替換
查看全部 -
.i文件內函數在底端可以看見
$????跳到文件底部 或 G 或 shift+g
查看全部 -
.i????生成一個i后綴的文件
-E????只進行預處理
查看全部 -
編譯文件的四個步驟
查看全部 -
結構體內存占用大小計算方法查看全部
-
如何訪問結構體成員:
//數組,攻擊力,價值
struct mk14 mk15 = {"mk14_name",100,200};
//訪問結構體第一個變量
printf("%s\n",mk15.name);
//如果要對結構體進行運算,需要寫完整 --》 mk15.atk++
如何定義一個結構體數組
結構體可以重復使用
//同一個結構體定義兩種不同的變量,如同都是武器,都是武器不同,其他參數就不同
struct mk14 mk16[2] = { {"mk15_name",500,1000}, {"mk16_name",555,1111} };
//第一個武器 第二個武器
printf("%s\n,%d\n",? mk16[0].name,? mk16[1].atk);
查看全部 -
? ?3-1
? ?結構體 stcuct 不同變量的集合
? ?//定義一種變量:里面可有多種變量的定義
? ?結構體名字的三種定義:
? ?
1:在函數里面定義
struct mk14{ //定義一個武器變量
char name[20]; //武器名字
int atk; //攻擊力
int price; //武器價值
}
int main(){
int a;
float b;
struct mk14 awm;
return 0;
}
2:在結構體后面定義名字,類似如 typedef
struct mk14{ //定義一個武器變量
char name[20]; //武器名字
int atk; //攻擊力
int price; //武器價值
}awm;
int main(){
int a;
float b;
return 0;
}
3:去掉結構體名字,但是這樣就不能在次定義名字了。
struct { //定義一個武器變量
char name[20]; //武器名字
int atk; //攻擊力
int price; //武器價值
}awm;
int main(){
int a;
float b;
return 0;
}
查看全部 -
typedef 起別名 u8,u16之類的,也可以對函數進行起別名
如 typedef int main(){} naim? ?--> 將int main() 一整個函數定義為naim
typedef有作用域的問題
define沒有作用域的問題
而且,typedef 是在 .i文件之后執行的,會被C語言的語法所限制,而define 不會
查看全部 -
預處理階段工作:①將頭文件展開直接放置到源文件中
? ? ? ? ? ? ? ? ? ? ②宏替換
? ? ? ? ? ? ? ? ? ? ③條件編譯
注意:宏替換只是簡單得字符串替換,且可以傳遞參數。
例如,#define N(n) n*10
? ?int b = N(a);? // 首先n替換成a,然后a*10。
易錯:#define ADD(a,b) a+b
? int c = ADD(a,b) * ADD(a,b);??
/* 經過簡單的替換會得到 a+b*a+b,這顯示不是我們想要的結果,因此加上括號保證優先級不會出錯。*/
正確寫法:#define ADD(a,b) (a+b) 這樣變換后會成 (a+b)*(a+b)
一般寫法:
int add(int a,int b)
{ return a+b; ? }
int c = a+b;
那么宏定義寫法的優勢在哪:
一般寫法:參數ab 必須是一種類型的變量,要么整形 int,要么浮點型 float,
字符串不這么寫(詳見C語言入門第六章6-8 )
宏定義:參數ab 可以是任意,因為在宏里面所有參數都會被單成字符串來處理,
? ? 只要修改 int c 前面的 int 就行
查看全部 -
2-1:
linux c 預處理:
編譯的四個步驟:.c文件—>.i文件(預處理)->.s文件(編譯)->.o文件(匯編)->可執行文件(鏈接)
gcc -o helloworld.i helloworld.c -E生成一個.i文件,只進行預處理
.c和.i文件都是C的語法。.i展開了頭文件和進行宏替換(宏定義)
2-2:
宏定義符:#define??
c語言常量分為直接常量和符號常量:
#define 標識符 常量值(沒有分號)
宏的本質是在預處理階段發生的單純的字符串替換(宏替換);
在預處理階段,宏不考慮 C的語法。例如:
#define n int main(
n){} == int main(){}? //這樣寫是可以的
而宏的作用通常是用于替換一些比常用的變量或名字:u8、u16之類的
查看全部 -
4-1 Linux C 公用體
abc 存放到一個公用體中,節省開銷 ,同一時刻只能存儲一個成員
union data{? int a;int b;int c;};
結構體空間大小涉及到字節對齊,對齊的目的是讓計算機快速讀寫
結構體對象大小=最后一個成員的大小+最后一個成員的偏移量+填充字節數
每個成員所占內存大小的偏移量=成員字節大小的整數倍。
a的偏移量是0,b的偏移量是4,c的偏移量是8
結構體總大小是12,是最寬的基本類型成員大小(int ,4)的整數倍
公用體變量和各個成員的變量是一個地址
查看全部
舉報