嵌入式学习之路(十七)——C语言学习(12)
今天我们来讲讲条件编译指令,宏,结构体和联合体
一。宏的作用
今天一上来就讲宏的作用吧。宏在预处理阶段被直接替换成它所代表的内容
#definepi 3.14
#definesum(a,b) ((a)+(b))
做的只是替换!!这个就不多说,以后有机会碰到再说
二。条件编译指令
条件编译现阶段我们用到最多的地方就是防止头文件多次定义
#ifndef__add_H__
#define__add_H__
头文件定义部分
头文件定义部分
#endif
还有就是
#if(逻辑表达式1)
#elif(逻辑表达式2)
#else
#endif
这边顺带提一下include””和include<>的区别:
“”表示搜索路径是当前目录,找不到再去系统指定默认的目录寻找
<>只从系统默认的目录去寻找
三。结构体
结构体仅仅是一种数据类型,它不在内存中占据存储位置,他仅仅描述了多个数据之间的关系。
使用结构体声明的变量叫做结构体变量,它们才真正占据存储位置。
struc temp {
int id;
char name[20];
double sal;
};
上面我们就定义了一个结构体,表示员工的信息id,姓名和工资情况
我们就可以这样定义:struct emp people[100];//定义100个员工信息、方便操作
我们就可以这样取出值:people[0].id就是第一个员工的编号
people[0].name就是第一个员工的姓名
people[0].sal就是第一个员工的工资
当然每次定义都要加上struct关键字,有些人可能觉得很不方便,那我们可以起别名
typedef struct {
int id;
char name[20];
double sal;
}emp;
下次再定义的话,就直接emp people[100];就可以了,大家可以自己选择。
结构体指针:
当然结构体也可以有结构体指针,而且要想传递结构体的值的话,都要用结构体指针
我们可以这样定义结构体指针,emp *p_p = people[0];
p_p就指向了第一个员工的地址,所以我们可以这样用:p_p->id,p_p->name,p_P->sal
结构体指针就是用->来得到结构体里面的元素
结构体的对齐和补齐特性:
对齐:计算机把4个字节合成一组,int类型4个字节必须是在同一个组里,short类型2个字节必须是一组中的前两个或者后两个
任何变量的地址一定是它自身大小的整数倍,超过4字节的的数据大小按4的倍数计算
补齐:整个结构体大小必须是内部最大变量大小的整数倍,超过4字节按照4个字节计算
,在最后会浪费一些字节
这样说没有什么感觉,我们来看一下程序,这样才有说服力
1 #include <stdio.h>
2
3 typedef struct {
4 short s;/*两个字节*/
5 int i;/*四个字节*/
6 char c;/*一个字节*/
7 }test;
8 int main()
9 {
10 printf("sizeof(test) = %d\n",sizeof(test));
11 return 0;
12 }
我们直接来看一下输出:
:~/csdn/day16$./struct
sizeof(test)= 12
四。联合
联合:是一种数据类型,也可以用来表示多组不同数据之间的关系
联合中不同部分数据在内存中占据的位置是重叠的
联合使用union关键字声明
联合的大小是其中占地最大的一组变量的大小
对联合中任何一组数据的修改会影响到其他组
联合没有什么好讲的,我直接来说他的一个用处吧,就是测试我们的系统是大端还是小端存储。
直接上代码:
1 #include <stdio.h>
2 void litorbig(void);
3 void litorbig(void)
4 {
5 union un {
6 int i;
7 char c;
8 };
9 union un lob;
10 lob.i = 1;
11 if(lob.c == 1)
12 {
13 printf("小端\n");
14 }
15 else
16 {
17 printf("大端\n");
18 }
19 }
20 int main()
21 {
22 litorbig();
23 return 0;
24 }
结果是什么,我们来看下
:~/csdn/day16$./union
小端
好了,相信大家也懂了,这个很简单!