嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY15
概述:
1、结构体
2、共用体
3、枚举
4、大小端
5、条件编译(书写头文件)----》工程目录
笔记:
1、结构体:----》关键字:struct
概念:可以存放多种数据类型的集合,跟数组类似,只不过比数组更兼容
注意:结构体是一种构造数据类型
定义格式:----》如何构造一个结构体类型
struct 结构体名
{
数据类型1 成员1;
数据类型2 成员2;
…
数据类型n 成员n;
};
如何利用构造好的结构体类型定义一个变量?
回顾:之前如何定义变量?
数据类型 变量名;
定义结构体变量的格式:
struct 结构体名 结构体变量名; / 结构体类型 结构体变量名;
如何访问结构体中每一个成员?
(1)方式一:
变量名.成员名;
(2)方式二:
指针变量名->成员名;
#include <stdio.h>
//构造一个结构体类型
struct Car
{
char Card[20];
char Color[20];
int passger;
}car;
int main(int argc, const char *argv[])
{
printf("sizeof(CAR) = %d\n",sizeof(struct Car));
//定义结构体指针变量
//CAR car;//定义结构体变量
struct Car *pCar = &car;//将结构体变量的地址赋值给结构体指针变量
printf("plese input the car messages:\n");
scanf("%s%s%d",pCar->Card,pCar->Color,&pCar->passger);
printf("输出该车的信息为:\n");
printf("车牌号: %s\t颜色: %s\t核载人数: %d\n",pCar->Card,\
pCar->Color,\
pCar->passger);
return 0;
}
结构体指针:
如何定义一个结构体指针?
格式:
结构体数据类型 * 指针变量名;
如何利用结构体指针访问结构体中的每一个成员?
—》通过方式二即可!----》指针变量名->成员名
内存对齐:
在32OS下,定义结构体时,会按照当前结构体中占字节空间最大的来进行分配
32OS下最大只能按照4字节分配,(double相当于分配空间时按照两个4字节进行分配空间)
总结:定义结构体时,将占用空间大的类型写在前面可以减少内存的使用情况。
结构体数组:
格式:
结构体数据类型 数组名[元素个数];
#include <stdio.h>
#define N 5
#define SIZE 3
//实现定义一个结构体,用来存放5个学生的信息
typedef struct student
{
char name[20];
int age;
float score[SIZE];
}Stu;
int main(int argc, const char *argv[])
{
printf("size = %d\n",sizeof(Stu));
//定义一个结构体数组
Stu arr[N] = {{'\0',0,0}};
int i,j;
printf("请输入%d个学生的信息:\n",N);
for(i=0;i<N;i++)
{
scanf("%s%d",arr[i].name,&arr[i].age);
for(j=0;j<SIZE;j++)
{
//scanf("%f",&arr[i].score[j]);
//scanf("%f",(arr+i)->score+j);
//scanf("%f",&((arr+i))->score[j]);
scanf("%f",&((arr+i)->(*(score+j))));
}
}
printf("学生的信息为:\n");
for(i=0;i<N;i++)
{
printf("%s %d ",arr[i].name,arr[i].age);
for(j=0;j<SIZE;j++)
{
//printf("%.1f",arr[i].score[j]);
//printf("%.1f ",*((arr+i)->score+j));
printf("%.1f ",(arr+i)->score[j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
//定义一个学校的结构体
struct university
{
char school[20];
char department[20];
int career;
};
//定义一个热巴的结构体类型
typedef struct Dlireba
{
char name[20];
float height;
struct university State;
}Reba;
int main(int argc, const char *argv[])
{
//利用Reba定义一个变量
Reba rb;
printf("请输入演员的信息:\n");
scanf("%s%f%s%s%d",rb.name,&rb.height,rb.State.school,rb.State.department,&rb.State.career);
printf("打印的信息如下:");
printf("%s %.2f %s %s %d\n",rb.name,rb.height,rb.State.school,\
rb.State.department,rb.State.career);
return 0;
}
#include <stdio.h>
//定义一个学校的结构体
/*struct university
{
char school[20];
char department[20];
int career;
};*/
//定义一个热巴的结构体类型
typedef struct Dlireba
{
char name[20];
float height;
//struct university State;
struct university
{
char school[20];
char department[20];
int career;
}State;
}Reba;
int main(int argc, const char *argv[])
{
//利用Reba定义一个变量
Reba rb;
printf("请输入演员的信息:\n");
scanf("%s%f%s%s%d",rb.name,&rb.height,rb.State.school,\
rb.State.department,&rb.State.career);
printf("打印的信息如下:");
printf("%s %.2f %s %s %d\n",rb.name,rb.height,rb.State.school,\
rb.State.department,rb.State.career);
return 0;
}
2、共用体:关键字:union
概念:多个成员共用同一片内存空间
注意:分配空间时以占字节最大的那个成员为准进行分配
定义格式:----》如何构造一个共用体类型
union 结构体名
{
数据类型1 成员1;
数据类型2 成员2;
…
数据类型n 成员n;
};
#include <stdio.h>
//定义一个共用体
typedef union AA
{
int a;
short b;
char c;
}Type;
int main(int argc, const char *argv[])
{
//定义共用体变量
Type aa;
aa.a = 98;
printf("aa.a = %d\n",aa.a);
printf("aa.c = %c\n",aa.c);
aa.c = 'k';
printf("aa.a = %d\n",aa.a);
printf("size = %d\n",sizeof(Type));
return 0;
}
3、枚举—》和宏常量比较类似
关键:enum----》一般被用来做错误码多一点
定义格式:----》如何构造一个枚举类型
enum 枚举名
{
成员1,
成员2,
。。。
成员n
};
注意:枚举中的成员值默认从0开始,后面依次累加1
如果想要修改,则直接在其成员后面赋值即可,那么后面的值也在其新值基础之上累加1
#include <stdio.h>
//定义一个枚举类型
enum ERRORNU
{
MALLOC_ERROR,
ERROR = -2,
OK
};
int main(int argc, const char *argv[])
{
printf("%d %d %d\n",MALLOC_ERROR,ERROR,OK);
return 0;
}
4、大小端(字节序)
大小端:大端存储/小端存储
大端存储:低字节处的内容存储在高地址处,高字节序的内容存放在低地址处
小端存储:低字节处的内容存储在低地址处,高字节序的内容存放在高地址处
#include <stdio.h>
union AA
{
int a;
short b;
char c;
};
int main(int argc, const char *argv[])
{
union AA aa;
aa.a = 0x12345678;
char *p = (char *)&aa.a;
int i;
for(i=0;i<4;i++)
{
printf("%#x\n",*(p+i));
}
return 0;
}