-
对比.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)
每个成员所占内存大小的偏移量=成员字节大小的整数倍。(若不是,则编译器会在前一个成员后做字节填充,使这个成员的偏移量=字节大小的整数倍。计算结构体内存地址大小时若最后一个成员的偏移量仍不等于这个成员字节大小的整数倍,会在最后一个成员后做字节填充。)
打印某个变量的字节大小:
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;
查看全部
举报