野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17221|回复: 4

stm32之结构体,指针方面问题求解~~~

[复制链接]
发表于 2015-3-30 11:28:50 | 显示全部楼层 |阅读模式
本帖最后由 liuchang 于 2015-3-30 11:36 编辑

小弟最近在玩stm32,慢慢发现自己在C语言,尤其是对指针和结构体的理解方面有很多问题,如下是stm32-USB Device中的一段函数,恳请大神不惜赐教~~~
typedef struct _DEVICE_PROP  
{                     
  void (*Init)(void);//以这个函数指针为例:这个指针包含了(*Init)(void)这个函数的入口地址     
  void (*Reset)(void);      
  void (*Process_Status_IN)(void);
  void (*Process_Status_OUT)(void);
  RESULT (*Class_Data_Setup)(uint8_t RequestNo);
  RESULT (*Class_NoData_Setup)(uint8_t RequestNo);
  RESULT  (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);

  uint8_t* (*GetDeviceDescriptor)(uint16_t Length);
  uint8_t* (*GetConfigDescriptor)(uint16_t Length);
  uint8_t* (*GetStringDescriptor)(uint16_t Length);
  void* RxEP_buffer;  
  uint8_t MaxPacketSize;
} DEVICE_PROP;//按小弟理解:这里的DEVICE_PROP是一种数据类型(例如char类型),该数据类型包含很多函数指针而已~这样理解正确吗???
DEVICE_PROP Device_Property =
  {//这里DEVICE_PROP类型的Device_Propety,我是把它理解成结构体变量?还是该理解成结构体指针(地址)?
    MASS_init,
    MASS_Reset,//这里的地址与上面的函数指针一一对应???
    MASS_Status_In,
    MASS_Status_Out,
    MASS_Data_Setup,
    MASS_NoData_Setup,
    MASS_Get_Interface_Setting,
    MASS_GetDeviceDescriptor,
    MASS_GetConfigDescriptor,
    MASS_GetStringDescriptor,
    0,        0x40//那这里的0,0x40该如何理解?请大神指教~~~
  };


            


回复

使用道具 举报

发表于 2015-3-30 12:00:04 | 显示全部楼层

typedef struct _DEVICE_PROP  
{                     
   void (*Init)(void);//以这个函数指针为例:这个指针包含了(*Init)(void)这个函数的入口地址     
   void (*Reset)(void);       //是的,这些都是函数指针
   void (*Process_Status_IN)(void);
   void (*Process_Status_OUT)(void);
   RESULT (*Class_Data_Setup)(uint8_t RequestNo);
   RESULT (*Class_NoData_Setup)(uint8_t RequestNo);
   RESULT  (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);

   uint8_t* (*GetDeviceDescriptor)(uint16_t Length);
   uint8_t* (*GetConfigDescriptor)(uint16_t Length);
   uint8_t* (*GetStringDescriptor)(uint16_t Length);
   void* RxEP_buffer;  
   uint8_t MaxPacketSize;
} DEVICE_PROP;//按小弟理解:这里的DEVICE_PROP是一种数据类型(例如char类型),该数据类型包含很多函数指针而已~这样理解正确吗???

这个device_prop是结构体类型,该结构体类型包含了很多指针变量,而这些指针变量恰好是函数指针变量


Device_Property 是用DEVICE_PROP类型定义的结构体变量的实体,


就像 int i 定义语句一样。DEVICE_PROP理解成int(变量类型),Device_Property 理解成 i (变量实体)。

DEVICE_PROP Device_Property =
   {//这里DEVICE_PROP类型的Device_Propety,我是把它理解成结构体变量?还是该理解成结构体指针(地址)?
    MASS_init,
     MASS_Reset,//这里的地址与上面的函数指针一一对应???
是的,一 一对应,实际上这就是对结构体变量Device_Propety的初始化赋值,就跟数组初始化赋值一样,只是它的赋值内容比较特别,是函数指针而已。函数名实际上就是函数指针,在工程里你是可以找到MASS_init,MASS_Reset之类的函数定义的。
    MASS_Status_In,
     MASS_Status_Out,
     MASS_Data_Setup,
     MASS_NoData_Setup,
     MASS_Get_Interface_Setting,
     MASS_GetDeviceDescriptor,
     MASS_GetConfigDescriptor,
     MASS_GetStringDescriptor,
     0,        0x40//那这里的0,0x40该如何理解?请大神指教~~~

0对应void* RxEP_buffer这个指向缓冲区的指针,初始化赋值为0,其实是表示还没有确定,后面用到的时候会给这个结构体成员赋值的。
0x40就是uint8_t MaxPacketSize;的值了。

   };


翻翻c语言的书,把结构体章节重新看一遍吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-30 13:10:03 | 显示全部楼层
flyleaf 发表于 2015-3-30 12:00
typedef struct _DEVICE_PROP  
{                     
   void (*Init)(void);//以这个函数指针为 ...

感谢大神的点拨~~~
回复 支持 反对

使用道具 举报

发表于 2015-4-18 08:52:32 | 显示全部楼层
flyleaf 发表于 2015-3-30 12:00
typedef struct _DEVICE_PROP  
{                     
   void (*Init)(void);//以这个函数指针为 ...

问题:在MDK中 int*i;  i=0x00100100; 会出现错误
解释:在MDK中 指针不能直接赋值。
这样的理解对么?还是赋值语句就有问题
谢谢你
回复 支持 反对

使用道具 举报

发表于 2015-4-18 09:19:41 | 显示全部楼层
这玩艺有点像面向对象语言中的类,包含了一堆的成员方法(其实是函数指针)

但是没面向对象语言里的类那么直观和好理解
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-29 05:34 , Processed in 0.047420 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表