-
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)的整数倍
公用体变量和各个成员的变量是一个地址
查看全部
举报