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