我正在阅读以下函数声明。
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;
};
我对指针的指针没有多少经验,我的问题是 - 作者在这里使用**
有明显的原因吗?或者你为什么要用一个?
答案 0 :(得分:1)
当需要向T
类型的对象添加间接级别时,可以使用指针键入T
。当类型T
恰好是指针时,您可以指向指针。
在您的特定情况下,该功能似乎需要一次返回多个内容。 C中用于提供多个结果的函数的常用习惯是将指针传递给函数,并让函数设置它们。您的功能提供了三个结果:
dataArrayP
,numDataP
,dataArrayP
和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。