何时使用指针指向C?

时间:2017-11-09 16:18:27

标签: c pointers struct

我正在阅读以下函数声明。

static uint8_t prv_read(uint16_t instanceId,
                        int * numDataP, 
                        lwm2m_data_t ** dataArrayP,
                        lwm2m_object_t * objectP) 

第三个参数lwm2m_data_t ** dataArrayP是指向以下结构的指针。

typedef struct _lwm2m_data_t lwm2m_data_t;

struct _lwm2m_data_t
{
    lwm2m_data_type_t type;
    uint16_t    id;
    union
    {
        bool        asBoolean;
        int64_t     asInteger;
        double      asFloat;
        struct
        {
            size_t    length;
            uint8_t * buffer;
        } asBuffer;
        struct
        {
            size_t         count;
            lwm2m_data_t * array;
        } asChildren;
        struct
        {
            uint16_t objectId;
            uint16_t objectInstanceId;
        } asObjLink;
    } value;
};

我对指针的指针没有多少经验,我的问题是 - 作者在这里使用**有明显的原因吗?或者你为什么要用一个?

1 个答案:

答案 0 :(得分:1)

当需要向T类型的对象添加间接级别时,可以使用指针键入T。当类型T恰好是指针时,您可以指向指针。

在您的特定情况下,该功能似乎需要一次返回多个内容。 C中用于提供多个结果的函数的常用习惯是将指针传递给函数,并让函数设置它们。您的功能提供了三个结果:

  • dataArrayPnumDataP
  • 中的项目数
  • 一组数据,通过dataArrayP
  • 一个lwm2m对象,通过objectP

通过在函数内设置指针返回所有三个结果。第二个结果恰好是一个指针,即lwm2m_data_t *。为了通过设置指针返回指针,必须传递双指针:

int numData;
lwm2m_data_t *dataArray;
lwm2m_object_t object;
uint8_t status = prv_read(instanceId, &numDataP, &dataArray, &object);

注意:双指针的另一个常见用途是defining jagged arrays