2017-11-09 11 views
1

私は次の関数宣言を読んでいます。Cでポインタへのポインタを使用するタイミングは?

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つを使用しますか?

+1

通常、マトリックスを示す。 n次元配列。 – AndyG

+0

@artic sol機能の説明を読みます。 –

+0

@ VladfromMoscowありがとうが、私は盲目です。 –

答えて

1

タイプTのオブジェクトにレベルの間接参照を追加する必要がある場合は、ポインターを使用してTを入力します。タイプTがポインタの場合は、ポインタへのポインタを作成します。関数が一度にいくつかのことを返す必要があることが表示されますあなたの特定の状況で

。いくつかの結果を提供する関数の共通のイディオムは、結果へのポインタを関数に渡し、関数にそれらを設定させることです。すべてのobjectP

を通じて、

  • dataArrayPのアイテム数、numDataPを通じて、
  • データの配列、dataArrayP、および
  • てlwm2mオブジェクト:あなたの関数は、3つの結果を提供します3つの結果は関数内にポインタを設定することによって返されます。 2番目の結果はポインター、つまり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です。

関連する問題