【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(2)

简介: 【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(2)

条件编译和结构体

条件编译

编译器根据条件的真假决定是否编译相关的代码**(非常常用)**

常见的条件编译有两种方法:


根据宏是否定义,其语法如下:

#ifdef <macro>

……

#else

……

#endif

根据宏的值,其语法如下:

#if <macro>

……

#else

……

#endif

结构体

在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据——结构体(structure),简称结构。


定义一个结构体类型的一般形式为:

struct  结构体名
{
  数据类型   成员名1;
  数据类型   成员名2;
  ...
  数据类型   成员名n;
};


举个例子:

定义一个职工worker结构体如下:


struct worker
{   
  long number;
  char name[20];
  char sex;  
  int age;          //  age是成员名
  float salary;
  char address[80];
};          //注意分号不能省略
int  age = 10;    //age是变量名


特点:


结构体类型是用户自行构造的。

它由若干不同的基本数据类型的数据构成。

它属于C语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。

定义结构体变量方法

1.先定义结构体类型再定义变量名

这是C语言中定义结构体类型变量最常见的方式


struct 结构体名
{
            成员列表;
};
struct 结构体名 变量名;


举个例子:


truct worker
{
  long number;
  char name[20];
  char sex;
  int age;
  float salary;
  char address[80];
  char phone[20];
};   
struct worker worker1,worker2;


2.在定义类型的同时定义变量


struct 结构体名
{
  成员列表;
}变量名;


3.直接定义结构类型变量

其一般形式为:


struct      //没有结构体名
  {
      成员列表;
   }变量名


结构体的大小

使用sizeof来求


sizeof(struct worker)
sizeof(worker1)


补充一个知识点,就是结构体的大小求解中的两个原则:


不但结构体的成员有有效对齐值,结构体本身也有对齐值,这主要是考虑结构体的数组,对于结构体或者类,要将其补齐为其有效对齐值的整数倍。结构体的有效对齐值是其最大数据成员的自身对齐值;

存放成员的起始地址必须是该成员有效对齐值的整数倍。

对于每个对齐值有如下定义:


自身对齐值: 数据类型本身的对齐值,例如char类型的自身对齐值是1,short类型是2;

指定对齐值: 编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4;(整个结构体的长度需要是默认对齐的整数倍)

有效对齐值: 自身对齐值和指定对齐值中较小的那个。

举个例子:


struct ep{
  char a;
  int b;
  char c;
  char d;
};


首先a在第一个字节,而b因为自身长度为4,所以其实地址在低四个字节,占据四个字节此时长度为8个字节,两个char再占用两个字节,所以数据域长度为10个字节,由于ep自身的对齐值为4,所以最终应该为12个字节。


结构体变量的使用形式

结构体变量的成员用一般形式表示:结构体变量名.成员名

例如:worker1.number;worker1.name;worker1.sex;

在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如:


strcpy(worker1.name,”Zhang San”);
  worker1.age=26;
  strcpy(worker1.phone,”1234567”);
  worker1.sex=’m’;

结构体变量的初始化

struct 结构体名 变量名={初始数据表};

或者:


struct  结构体名
{
  成员列表;
}变量名={初始数据表}


结构体数组

具有相同结构体类型的结构体变量也可以组成数组,称它们为结构体数组。结构体数组的每一个数组元素都是结构体类型的数据,它们都分别包括各个成员(分量)项。


定义

定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。与上面的结构体的定义类似。

举个例子


//第一种
struct 
{
 char name[20];
 char sex;
 int age;
 char addr[20];
}stu[3]; 
//第二种
struct student
{
 char name[20];
 char sex;
 int age;
 char addr[20];
}stu[3]; 
//第三种
struct student
{
 char name[20];
 char sex;
 int age;
 char addr[20];
};
struct student stu[3];


相关文章
|
存储 Shell Linux
嵌入式 Linux Shell编程
嵌入式 Linux Shell编程
|
Linux
嵌入式(六)——Linux进阶命令
嵌入式(六)——Linux进阶命令
|
存储 NoSQL Ubuntu
Linux下C语言开发
Linux下C语言开发
Linux下C语言开发
|
存储 NoSQL Java
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(1)
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(1)
【从零开始的嵌入式生活】LinuxC语言4——LinuxC高级(1)
|
机器学习/深度学习 存储 物联网
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
【从零开始的嵌入式生活】LinuxC语言——shell脚本编程(1)
|
存储 Unix Linux
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
【从零开始的嵌入式生活】LinuxC语言——shell命令(2)
|
存储 网络协议 Linux
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
【从零开始的嵌入式生活】LinuxC语言——shell命令(3)
|
Linux Shell 数据安全/隐私保护
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
【从零开始的嵌入式生活】LinuxC语言——shell命令(1)
|
Ubuntu Unix Linux
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(1)
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(1)
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(1)
|
Ubuntu 安全 Shell
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(2)
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(2)
【从零开始的嵌入式生活】LinuxC语言——软件包管理和shell(2)