1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c语言struct结构体强制类型转换

c语言struct结构体强制类型转换

时间:2023-12-29 04:59:22

相关推荐

c语言struct结构体强制类型转换

1、无结构体标签

struct {int in;int out;}GPIO_t;

声明了一个无名结构体,并创建了一个结构体变量GPIO_t(已分配空间),该方法只适合创建一个结构体变量

typedef struct {int in;int out;}GPIO_t;/*静态分配内存*/GPIO_t GPIOA;/*动态分配内存*/GPIO_t *GPIOA = (GPIO_t*)malloc(sizeof(GPIO_t));free(GPIOA);

2、显示声明结构体标签

struct _GPIO_t{int in;int out;};

如需声明多个结构体变量:struct _GPIO_t GPIOA,GPIOB;

注:常用第二种方法声明创建结构体,具体高级用法请看下面讲解

二、强制类型转换

1、普通数据类型强制转换,使用强制类型转换符

(type_name) expression

例如:

int sum = 17, count = 5;double mean;mean = (double)sum / count;printf("Value of mean : %f \n",mean);

编译运行输出以下结果:

注:这里要注意的是强制类型转换运算符的优先级大于除法,因此 sum 的值首先被转换为 double 型,然后除以 count,得到一个类型为 double 的值

2、数据类型强制转化为结构体类型

#include <stdio.h>int main (void) {int a[] = {1,2,'a','b'};typedef struct _GPIO_t{int in;int out;int type;int value;}GPIO_t;GPIO_t *GPIOA = (GPIO_t *) &a;/** 等同于GPIO_t *GPIOA = (GPIO_t *) &a;* 因为数组的首地址为 可以表示为 a,&a,&a[0] */printf("%d \n",GPIOA->in);printf("%d \n",GPIOA->out);printf("%c \n",GPIOA->type);printf("%c \n",GPIOA->value);}

编译运行如何结果:

注:通过该方法可以把某一起始地址的数据类型与结构体成员相对应,以后直接通过结构体成员去访问

结构体成员之间默认32位对齐,在定义成员时需要特别注意

实用举例:

#include <stm32f10x.h>typedef struct{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;} GPIO_TypeDef;/*Peripheral base address define*/#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)/*函数调用*/#include "led.c"void LED_Init(void){RCC->APB2ENR|=1<<3; // 使能PORTA时钟GPIOA->CRL&=0XFF0FFFFF; GPIOA->CRL|=0X00300000;//PA.5 推挽输出GPIOA->ODR|=1<<5;//PA.5 输出高}

三、给结构体变量赋值

GPIO_t GPIOB = {.in = 3,.out = 4,.type = 'A',.value = 'B' };printf("%d \n",GPIOB.in);printf("%d \n",GPIOB.out);printf("%c \n",GPIOB.type);printf("%c \n",GPIOB.value);

注:callback函数使用时,直接给成员变量赋值

*举例说明结构体成员数据类型对齐问题

1、成员变量字节已经对齐使用

int a[] = {'abcd',4444};typedef struct _GPIO_t{char in;char out;char type;char value;int data;}GPIO_t;GPIO_t *GPIOA = (GPIO_t *) &a;printf("%c \n",GPIOA->in);printf("%c \n",GPIOA->out);printf("%c \n",GPIOA->type);printf("%c \n",GPIOA->value);printf("%d \n",GPIOA->data);

编译运行输出结果:

注:数据存储格式分为大小端存储,所以结构引用输出顺序可能不太对应

2、成员变量没有对齐

int a[] = {1234,5678,'abcd',4444};typedef struct _GPIO_t{int in;int out;char type;char value;int data;//会自动四字节对齐因此直接指向a[3] }GPIO_t;GPIO_t *GPIOA = (GPIO_t *) &a;printf("%d \n",GPIOA->in);printf("%d \n",GPIOA->out);printf("%c \n",GPIOA->type);printf("%c \n",GPIOA->value);printf("%d \n",GPIOA->data);

编译运行结果:

注:因为自动对齐缘故,其中有些数据会自动丢掉

3、成员变量不使用自动给对齐

int a[] = {1234,5678,'abcd',4444};/** ARM系统使用 __packed取消字节对齐 */#pragma pack(1)//强制设置1字节对齐 typedef struct _GPIO_t{int in;int out;char type;char value;int data;//会自动四字节对齐因此直接指向a[3] } GPIO_t;GPIO_t *GPIOA = (GPIO_t *) &a;printf("%d \n",GPIOA->in);printf("%d \n",GPIOA->out);printf("%c \n",GPIOA->type);printf("%c \n",GPIOA->value);printf("%d \n",GPIOA->data);

编译运行结果:

注:最后一个成员由于对齐错误出现乱码

### 转载,原文出处:[原文](/blog_xu/article/details/84374473)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。