嵌入式学习之路(十七)——C语言学习(12)

嵌入式学习之路(十七)——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

小端

好了,相信大家也懂了,这个很简单!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值