如何在C中使用a#define中的指针和定义

如何在C中使用a#define中的指针和定义,c,pointers,client,user-defined-functions,C,Pointers,Client,User Defined Functions,我想知道这个定义的代码段中的gattCharCfg\u t是如何使用的 以下是#定义剪报: // Client Characteristic Configuration table (from CCC attribute value pointer) #define GATT_CCC_TBL( pValue ) ( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) ) 下面是如何在给定代码中的几个位置访问它: //

我想知道这个定义的代码段中的
gattCharCfg\u t
是如何使用的

以下是#定义剪报:

    // Client Characteristic Configuration table (from CCC attribute value pointer)
      #define GATT_CCC_TBL( pValue )           ( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) )
下面是如何在给定代码中的几个位置访问它:

    // Characteristic Configuration: voltage
    static gattCharCfg_t *voltDataConfig;

      // Allocate Client Characteristic Configuration table
  voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
                                                    linkDBNumConns);
    if (voltDataConfig == NULL)
    {
      return (bleMemAllocError);
    }

我想我不理解它是如何被访问的。我当然希望能有更透彻的解释,因为我只是回到c中。

在代码中,宏
GATT\u CCC\u TBL
1在任何地方都没有用处。代码正在强制转换
ICall_malloc()
的返回值,该值可能会将
void*
2返回到类型为
gattCharCfg\u t
3的指针。如果这真的是代码,那实际上是不必要的

voltDataConfig = ICall_malloc(sizeof(gattCharCfg_t) * linkDBNumConns)
更好的版本是

voltDataConfig = ICall_malloc(sizeof(*voltDataConfig) * linkDBNumConns)
可能是正确的


1这就是
#定义
实际定义的内容。
2您永远不需要将
void*
强制转换为另一个指针类型。

3请注意,
gattCharCfg\u t
实际上是在代码中使用
typedef
定义的类型,在任何地方都没有使用宏
GATT\u CCC\u TBL
1。代码正在强制转换
ICall_malloc()
的返回值,该值可能会将
void*
2返回到类型为
gattCharCfg\u t
3的指针。如果这真的是代码,那实际上是不必要的

voltDataConfig = ICall_malloc(sizeof(gattCharCfg_t) * linkDBNumConns)
更好的版本是

voltDataConfig = ICall_malloc(sizeof(*voltDataConfig) * linkDBNumConns)
可能是正确的


1这就是
#定义
实际定义的内容。
2您永远不需要将
void*
强制转换为另一个指针类型。
3请注意,
gattCharCfg\u t
实际上是一个用
typedef
定义的类型

  • (PTR\u类型)(pValue)
    -将pValue强制转换为PTR\u类型(指针)
  • *((PTR_TYPE)(pValue))
    -查看指针指向的内存位置
  • (gattCharCfg_t*)(*((PTR_TYPE)(pValue))
    -用于指向
    gattCharCfg_t
    结构的指针(可以是
    gattCharCfg_t
    的数组),而不是void*
  • GATT\u CCC\u TBL
    是一个宏,用于编写转换的快捷方式。关于你帖子中的其他代码

      voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
                                                        linkDBNumConns);
    
  • sizeof(gattCharCfg\u t)
    -取
    gattCharCfg\u t
    的大小,例如23字节

  • *linkDBNumConns
    -将其乘以linkDBNumConns,例如,100等于2300字节

  • ICall\u malloc(..)
    -分配那么多内存

  • (gattCharCfg\u t*)
    -将内存中的该位置强制转换为指向
    gattCharCfg\u t
    结构的指针

  • 更新。看起来此代码来自蓝牙协议栈,在这种情况下

    typedef struct
    {
      uint16 connHandle; //!< Client connection handle
      uint8  value;      //!< Characteristic configuration value for this client
    } gattCharCfg_t;
    
    typedef结构
    {
    uint16连接句柄;//!<客户端连接句柄
    uint8值;//!<此客户端的特征配置值
    }关塔查;
    
    因此,
    GATT\u CCC\u TBL(pValue)
    将获取一个指针值
    pValue
    ,并将其指向一个或多个gattCharCfg\t结构-最有可能是这些结构的数组,因为_TBL很可能是“表”

  • (PTR\u类型)(pValue)
    -将pValue强制转换为PTR\u类型(指针)
  • *((PTR_TYPE)(pValue))
    -查看指针指向的内存位置
  • (gattCharCfg_t*)(*((PTR_TYPE)(pValue))
    -用于指向
    gattCharCfg_t
    结构的指针(可以是
    gattCharCfg_t
    的数组),而不是void*
  • GATT\u CCC\u TBL
    是一个宏,用于编写转换的快捷方式。关于你帖子中的其他代码

      voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
                                                        linkDBNumConns);
    
  • sizeof(gattCharCfg\u t)
    -取
    gattCharCfg\u t
    的大小,例如23字节

  • *linkDBNumConns
    -将其乘以linkDBNumConns,例如,100等于2300字节

  • ICall\u malloc(..)
    -分配那么多内存

  • (gattCharCfg\u t*)
    -将内存中的该位置强制转换为指向
    gattCharCfg\u t
    结构的指针

  • 更新。看起来此代码来自蓝牙协议栈,在这种情况下

    typedef struct
    {
      uint16 connHandle; //!< Client connection handle
      uint8  value;      //!< Characteristic configuration value for this client
    } gattCharCfg_t;
    
    typedef结构
    {
    uint16连接句柄;//!<客户端连接句柄
    uint8值;//!<此客户端的特征配置值
    }关塔查;
    

    因此,
    GATT\u CCC\u TBL(pValue)
    将获取一个指针值
    pValue
    ,并将其指向一个或多个gattCharCfg\t结构-最有可能是这些结构的数组,因为_TBL很可能是“表”

    该行不定义
    gattCharCfg\u t
    。此外,在代码中查找GATT\u CCC\u TBL(..)显示该行不定义
    gattCharCfg\u t
    。此外,在代码中查找GATT\u CCC\u TBL(..)显示的位置“将获取一个指针值
    pValue
    并将其转换为指向一个或多个gattCharCfg_t结构的指针”我想说您在这里错过了一个间接指向。它应该是“将获取一个指针值
    pValue
    并将其指向的内容转换为指向的指针…”。请注意
    中的
    *
    (*(((PTR_类型)(pValue)))
    @alk,我同意“将指针值
    pValue
    转换为指向一个或多个gattCharCfg\u t结构的指针”我想说您在这里错过了一个间接指向。它应该是“将指针值
    pValue
    转换为指向的指针…”。注意
    (*((PTR\u类型)中的
    *
    )(pValue))
    @alk,我同意这一点