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