1、结构体定义的三种方式
1.1 第一种
- 定义时初始化,其中
struct su
是一种结构体类型,相当于定义整型变量的int
,此处struct su
所定义的结构体变量包含2个整型变量和1个字符变量。su
相当于结构体类型名,可随意起名字。
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct su
{
int a;
int b;
char c;
};
struct su YUAN = {10,20,'A'};
printf("%d\n",YUAN.a);
printf("%d\n",YUAN.b);
printf("%c\n",YUAN.c);
return 0;
}
- 定义后初始化,这种方式只能用
.
引出结构体成员进行逐个初始化,如下
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct su
{
int a;
int b;
char c;
};
struct su YUAN;
YUAN.a = 1;
YUAN.b = 2;
YUAN.c = 'A';
printf("%d\n",YUAN.a);
printf("%d\n",YUAN.b);
printf("%c\n",YUAN.c);
return 0;
}
1.2 第二种
- 和第一种定义相似,不同之处在于定义结构体类型时自带1个(或多个)此类型的结构体变量,初始化方式与第一种相同,如下所示
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct su
{
int a;
int b;
char c;
}yuan;
struct su YUAN = {10,20,'A'};
yuan.a = 4;
yuan.b = 5;
yuan.c = 'B';
printf("%d\n",YUAN.a);
printf("%d\n",YUAN.b);
printf("%c\n",YUAN.c);
printf("%d\n",yuan.a);
printf("%d\n",yuan.b);
printf("%c\n",yuan.c);
return 0;
}
1.2 第三种
- 定义与前两种稍有不同,在定义结构体类型时没有结构体类型名,后面直接跟相应类型的结构体变量,此种方法不推荐,如下
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct
{
int a;
int b;
char c;
}yuan;
yuan.a = 4;
yuan.b = 5;
yuan.c = 'B';
printf("%d\n",yuan.a);
printf("%d\n",yuan.b);
printf("%c\n",yuan.c);
return 0;
}
2、结构体在stm32标准库函数中的应用
- 使用库函数时,不免会有许多结构体指针或者结构体变量,然而这些结构体指针就是指向了相应寄存器的地址,我们根据需要用的连续地址的寄存器就可以放在一个结构体里,只需要把首寄存器地址强制类型转换为相应的结构体类型指针即可,如下例所示
#include <stdio.h>
int main()
{
typedef struct
{
int IDR;
int ODR;
int BRR;
}GPIOB_TypeDef;
((GPIOB_TypeDef*)(0x65FE1C))->IDR = 30;
((GPIOB_TypeDef*)(0x65FE1C))->ODR = 40;
((GPIOB_TypeDef*)(0x65FE1C))->BRR = 50;
printf("%d\n",((GPIOB_TypeDef*)(0x65FE1C))->IDR);
printf("%d\n",((GPIOB_TypeDef*)(0x65FE1C))->ODR);
printf("%d\n",((GPIOB_TypeDef*)(0x65FE1C))->BRR);
return 0;
}