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);

编译运行结果:

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

### 转载,原文出处:[原文](https://blog.csdn.net/blog_xu/article/details/84374473)

c语言struct结构体强制类型转换相关推荐

  1. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  2. 用JAVA定义两个结构体_c语言struct结构体的定义和使用

    c语言由于不像java,c#,c++等语言有对象,所以就用struct结构体来表示,其实作用是差不多的,下面来快速学习c语言struct结构体的定义和使用,以学生类student来举例,有三种定义方式 ...

  3. c语言struct结构体类型有关typedef定义的本名和别名

    c语言结构体类型的本名 首先,定义结构体的标准语法为 在c语言中,定义结构体的标准语法是: struct A {}; A是这个结构体的[**本名**].在使用本名定义一个新的结构体时, 必须加上str ...

  4. C语言中结构体的强制类型转换

    最近在学习C语言中的Socket,遇到了结构体强制类型转换的问题,在这里记录一下. 我们看一个例子 struct sockaddr_in seraddr;memset(&seraddr, 0, ...

  5. C 语言编程 — 结构体的数据类型转换

    目录 文章目录 目录 数组类型强制类型转换为结构体 结构体之间的强制类型转换 数组类型强制类型转换为结构体 先看一个例子: #include <stdio.h>int main(void) ...

  6. c 语言结构体类型转换,C 语言编程 — 结构体的数据类型转换

    目录 数组类型强制类型转换为结构体 先看一个例子: #include int main(void) { unsigned char arr[] = "0123456789abcdefghij ...

  7. 【零基础学C语言】知识总结八:struct 结构体与 union 共用体

    struct 结构体 struct即结构体,C程序中经常需要用相关的不同类型的数据来描述一个数据对象.例如,描述学生的综合信息时,需要使用学生的学号.姓名.性别等不同类型的数据时,像这种数据类型总是在 ...

  8. Go语言核心之美 3.4-Struct结构体

    struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...

  9. C语言中结构体struct的用法总结

    不积硅步,无以至千里.不积小流,无以成江海.每天进步一点点. 一.概述 结构体属于C语言提供给用户的可以进行自定义的数据类型,来满足一些个性化需求.它允许用户建立由不同类型数据组成的组合型的数据结构. ...

最新文章

  1. 将TVM集成到PyTorch上
  2. iOS-Swift中的递增(++)和递减(--)被取消的原因-官方答复
  3. 【Linux】 字符串和文本处理工具 grep sed awk
  4. CSAPP(8):系统级IO
  5. mysql 5.5 5.6 主从_mysql5.6+主从集的版本号(mysql5.5主机和从机载带后,5.5在设置有一定的差距)...
  6. TypeScript里对数组元素的自定义属性排序的实现原理
  7. 第四章例题、心得及问题。
  8. Teams Bot开发系列:Bot验证
  9. C++工作笔记-调试release版的dll
  10. C++ 语言基础 —— STL —— 算法 —— 二分查找算法
  11. sklearn之Pipeline 估计器
  12. 阿格尔克劳奇四分钟逆转 利物浦2-1小胜西汉姆联
  13. 10 分钟看懂消息队列 RocketMQ
  14. 如何双击连上校园网NCUWLAN?---bat+Python3给出了可行性答案
  15. 缠论108课_缠论108课完整版pdf_炒股108式
  16. Ubuntu安装eog遇到的坑及解决方案
  17. javaEE 深入理解 Session 与 Cookie
  18. 【JS组件系列】——表格组件神器:bootstrap table(二:父子表和行列调序)
  19. Deep Representation Learning for Trajectory Similarity Computation
  20. 黑客搜索大法(Google Hacking)

热门文章

  1. 浅谈“理论数学与应用数学之间的关系”
  2. 获得与管线相连的管件连接件
  3. phpdesigner 7 注册码 注册机 汉化版
  4. 点灯科技使用输入框实现信息远程查询
  5. 华为交换机N1软件包 License控制项说明及功能介绍
  6. windows释放隐藏分区
  7. iOS——nil、Nil、NULL和[NSNull null]的区别
  8. CMD命令行高级教程
  9. java cloneable 接口_JDK源码阅读笔记-Cloneable接口
  10. ESP8266笔记—DHT11温湿度传感器