-
對(duì)比.c與.i文件的區(qū)別:1、首先都是c的語(yǔ)法 2、.c文件開(kāi)頭的#include<stdio.h>變成了一堆代碼:預(yù)處理首先展開(kāi)了頭文件 3、預(yù)處理進(jìn)行了宏替換(用到宏的地方 都被替換成宏值,編譯器是把宏值當(dāng)做字符串)
如何申明一個(gè)宏: #define? 宏名(標(biāo)識(shí)符規(guī)范)? 宏值(注意編譯器把宏值當(dāng)做字符串)
截圖 :在預(yù)處理過(guò)程的宏替換
宏一般用途:為了便于修改代碼中反復(fù)使用到的常量? 數(shù)組的buffer
查看全部 -
.c 文件——.i文件:預(yù)處理
.i 文件——.s文件:編譯
.s文件——.o文件:匯編
.o文件——可執(zhí)行文件:鏈接?
為了查看.i文件:gcc -o helloworld.i helloworld.c -E
-E表示:讓gcc只進(jìn)行到預(yù)處理
查看.i文件:vi xx.i
查看全部 -
宏函數(shù):
eg.#define N(n) n*10
????int b=N(20)//在I文件中為:int b=20*10;
注意:#define ADD(a,b) a+b
?????????int e=ADD(10,20)*ADD(10,20)
????????由于宏只是字符串的復(fù)制,不進(jìn)行運(yùn)算,所以在I文件中為:
????????int e=10+20*10+20
????????根據(jù)運(yùn)算的優(yōu)先級(jí),要在宏定義的a+b外加上()
????????宏函數(shù)對(duì)參數(shù)沒(méi)有數(shù)據(jù)類型要求(區(qū)別與一般函數(shù))
查看全部 -
struct 占用空間計(jì)算
查看全部 -
1.左移 <<
將數(shù)據(jù)對(duì)應(yīng)的二進(jìn)制位值逐位左移若干位
規(guī)則:高位丟棄,低位補(bǔ)0
eg.a: 00000000 00000000 00000000 00101010
a<<4 (0000)00000000 00000000 00000010 10100000
應(yīng)用:將操作數(shù)*2^n
2.右移 >>
將數(shù)據(jù)對(duì)應(yīng)的二進(jìn)制位值逐位右移若干位
規(guī)則:低位丟棄,高位補(bǔ)0
應(yīng)用:將操作數(shù)/2^n
查看全部 -
1.^ 按位異或
操作規(guī)則:如果兩個(gè)操作數(shù)的對(duì)應(yīng)位相同,則結(jié)果數(shù)對(duì)應(yīng)位為0,否則為1.
應(yīng)用:1.定位反轉(zhuǎn)(任何數(shù)與2做按位異或運(yùn)算,二進(jìn)制位0變1,1變0)
? ?2.數(shù)值交換(
設(shè)有兩個(gè)操作數(shù)a,b;
a=a^b;
b=b^a;
a=a^b;
即完成交換
)
2.~ 按位取反
操作規(guī)則:操作數(shù)的二進(jìn)制位0變1,1變0.
查看全部 -
| 按位或
操作規(guī)則:如果這兩個(gè)數(shù)的二進(jìn)制數(shù)的某一位有一個(gè)為為1,結(jié)果數(shù)的對(duì)應(yīng)數(shù)位為1,否則為0.
應(yīng)用:設(shè)定數(shù)據(jù)的指定位置(任何數(shù)與2(0xFF)進(jìn)行按位或運(yùn)算結(jié)果都為255(后八位=1))
查看全部 -
位運(yùn)算符:
& 按位與
| 按位或
^ 按位異或
~ 按位取反
<< 左移
>> 右移
& 按位與
操作數(shù):有賦值的int型或char型
操作規(guī)則:如果這兩個(gè)數(shù)的二進(jìn)制數(shù)的某一位都為1,結(jié)果數(shù)的對(duì)應(yīng)數(shù)位為1,否則為0.
應(yīng)用:1.迅速清零(任何數(shù)與0進(jìn)行按位與運(yùn)算結(jié)果都是0)
? ?2.保留指定位置(將要取原數(shù)某位的位置保留,第二個(gè)數(shù)的對(duì)應(yīng)位置要為1)
? ?3.判斷操作數(shù)是否為奇數(shù)或偶數(shù)(如果操作數(shù)和1做按位與的運(yùn)算結(jié)果為1,則是奇數(shù),0則為偶數(shù))
查看全部 -
共用體:
為不同變量提供同一塊內(nèi)存地址
聲明方法:
union [name]{
????...
};
使用:union [union_name] [value_name];
共用體聲明時(shí)只能有一個(gè)常量。給共用體成員賦值時(shí)后賦值的變量值會(huì)覆蓋前一個(gè)。
共用體所占的內(nèi)存地址是其成員中內(nèi)存地址最大的成員的內(nèi)存地址。
結(jié)構(gòu)體對(duì)象大小=最后一個(gè)成員的大小+最后一個(gè)成員的偏移量+填充字節(jié)數(shù)
偏移量:結(jié)構(gòu)體中一個(gè)成員相對(duì)于共用體的首字節(jié)(即第一個(gè)成員的首字節(jié))所距離的大小。(那么第一個(gè)成員相對(duì)于結(jié)構(gòu)體的偏移量為0)
每個(gè)成員所占內(nèi)存大小的偏移量=成員字節(jié)大小的整數(shù)倍。(若不是,則編譯器會(huì)在前一個(gè)成員后做字節(jié)填充,使這個(gè)成員的偏移量=字節(jié)大小的整數(shù)倍。計(jì)算結(jié)構(gòu)體內(nèi)存地址大小時(shí)若最后一個(gè)成員的偏移量仍不等于這個(gè)成員字節(jié)大小的整數(shù)倍,會(huì)在最后一個(gè)成員后做字節(jié)填充。)
打印某個(gè)變量的字節(jié)大?。?/p>
printf("%lu",sizeof(...));
共用體與結(jié)構(gòu)體其他基本相同
查看全部 -
結(jié)構(gòu)體指針:
指向結(jié)構(gòu)體變量的指針:
eg.
struct weapon * w;
w = &weapon;
printf("name=%s\n",(*w).name)//或w->name
查看全部 -
初始化結(jié)構(gòu)體:
struct [結(jié)構(gòu)體名稱] [變量名] ={...,...,...,...};
訪問(wèn)結(jié)構(gòu)體成員:
[結(jié)構(gòu)體變量名].[結(jié)構(gòu)體成員名]
結(jié)構(gòu)體數(shù)組:
struct [結(jié)構(gòu)體名] [數(shù)組名] [num] ={...};
eg.struct weapon weapon[2]={{"a",50,100},{"b",100,200}};
?????printf("%d",weapon[0].atk);
查看全部 -
結(jié)構(gòu)體:不同數(shù)據(jù)類型變量的集合
數(shù)組:相同數(shù)據(jù)類型變量的集合
聲明結(jié)構(gòu)體:
eg.
struct weapon{
????char name[20];
????int atk;
????int price;
};
定義結(jié)構(gòu)體變量:
第一種:struct [名稱] [變量名];
第二種:在聲明時(shí)定義:eg.
struct weapon{
????char name[20];
????int atk;
????int price;
}weapon;//全局變量
第三種:eg.
struct {//沒(méi)有名稱,此后不能再定義
????char name[20];
????int atk;
????int price;
}weapon;
查看全部 -
typedef的作用:重命名變量數(shù)據(jù)類型
????語(yǔ)法:typedef [數(shù)據(jù)類型] [新的名字]
????eg.typedef int * pointer;//將int * 的數(shù)據(jù)類型命名為pointer
typedef VS define:
①預(yù)處理時(shí)define定義的宏會(huì)替換,但typedef定義的別名不會(huì)替換。
②作用域不同
③通常用于給自定義數(shù)據(jù)類型其別名
size_t : unsigned long的別名
查看全部 -
宏函數(shù):
eg.#define N(n) n*10
????int b=N(20)//在I文件中為:int b=20*10;
注意:#define ADD(a,b) a+b
?????????int e=ADD(10,20)*ADD(10,20)
????????由于宏只是字符串的復(fù)制,不進(jìn)行運(yùn)算,所以在I文件中為:
????????int e=10+20*10+20
????????根據(jù)運(yùn)算的優(yōu)先級(jí),要在宏定義的a+b外加上()
????????宏函數(shù)對(duì)參數(shù)沒(méi)有數(shù)據(jù)類型要求(區(qū)別與一般函數(shù))
查看全部 -
定義宏:
#define ...
eg.#define R 10
宏定義與預(yù)處理同時(shí)發(fā)生在第一階段,I文件中將C文件中引用宏的地方都替換成其表達(dá)式。(但只是將表達(dá)式的字符串移動(dòng)到引用宏的地方。)
eg.C文件中:#define R 10? ? int a=R;
????I文件中:int a=10;
查看全部
舉報(bào)