簡體   English   中英

清除混亂:指向指針的指針

[英]Clear out confusion: pointer to pointer

只是為了消除一些混亂。 我最近遇到了以下代碼(使用指向指針的指針):

int encode(unsigned char type, uint64_t input_length, unsigned char** outputdata)
{
   unsigned char* p = *outputdata;

   *p++ = (unsigned char)type;

   for (int i = sizeof(uint32_t) - 1; i >= 0; --i)
      *p++ = (unsigned char) ((input_length >> (i * 8)) & 0xFF);

   if(some condition) 
        *p++ = (unsigned char)(someInteger >> (input_length * 8) & 0xFF);  
   else
        *p++ = someStrValue++;  
   //..
}

所以我想如果您這樣調用此函數:

unsigned char *output = malloc(128);
encode(2,32,&output);

現在,來自encode方法的數據將存儲在內部: output[0]/*this will be type*/, output[1] /* 1st byte of input_length etc.*/, output[2],...對嗎?

我的問題是為什么在這種情況下必須使用上面的指針來完成? 我不能對單個指針做同樣的事情嗎? 像這樣:

int encode(unsigned char type, uint64_t input_length, unsigned char* outputdata)
{
       //unsigned char* p = *outputdata;

       *p++ = (unsigned char)type;

       for (int i = sizeof(uint32_t) - 1; i >= 0; --i)
          *p++ = (unsigned char) ((input_length >> (i * 8)) & 0xFF);

       //..
}

與上面的權利會有相同的效果嗎?

這樣稱呼:

unsigned char *output=malloc(128);
encode(2,32,output);

我的問題是,為什么在這種情況下必須使用上面的雙指針進行操作?

不是。 編寫該代碼的人顯然還不熟悉C語言。 讓我們剖析一下代碼:

  • unsigned char** outputdata絕對沒有理由使用指針對指針。
  • (unsigned char)為什么已經包含stdint.h時使用它? 使用uint8_t
  • *p++ = (unsigned char)type; 演員表是多余的。 為什么將無符號字符轉換為無符號字符?
  • *p++而不是嘗試將盡可能多的運算符壓縮到一行中,這絕對沒有任何好處,而是編寫可讀代碼:

     *p = type; p++; 
  • *p++ = (unsigned char) ((input_length >> (i * 8)) & 0xFF); 將分成幾行會有所幫助。 而且,掩蔽是多余的。

     *p = (uint8_t) (input_length >> (i * 8)); p++; 

通常,答案很可能就在於未顯示的代碼中-具體而言,在代碼所代表的部分中,可能存在指向指針的原因:

//..

如果該代碼包含:

*outputdata = p;

然后它告訴調用函數轉換后的數據在哪里。

如果沒有類似於*outputdata = p;代碼*outputdata = p; 在函數中,沒有必要將指針傳遞給指針。 我可以想到傳遞指針的唯一原因是:

  1. 您需要修改/返回指針(如*outputdata = p; )。
  2. 您需要符合特定的功能原型或接口。

沒有簡單的方法可以找到后者的原因,但是如果有一系列具有相似接口的功能,則可能需要修改其他一個或多個功能。 這有點麻煩-特定界面的目的是獲得統一的行為,但是如果行為不統一,則幾乎沒有好處。

該代碼將數據格式化為低位字節序。 不過,它在小字節序和大字節序的計算機上都可以工作。

奇怪的是,該函數采用uint64_t然后僅轉換uint32_t的數據值。

這種問題是好的函數注釋真正可以解決的地方。

函數是采用指針還是指針指針取決於其實際功能。

unsigned char *output = malloc(128);
encode(2,32,&output);

因此,問題是...編碼是否會改變輸出的值? 如果您傳遞NULL進行編碼,也許它會分配自己的緩沖區? 也許這是將來需要添加的功能?

是否將緩沖區作為指針或指針指針傳遞,實際上取決於方法的概念目的,而不取決於實現。 根據經驗,您希望盡可能少地取消引用。 因此,在所有條件都相同的情況下,最好使用單指針接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM