[英]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;
在函數中,沒有必要將指針傳遞給指針。 我可以想到傳遞指針的唯一原因是:
*outputdata = p;
)。 沒有簡單的方法可以找到后者的原因,但是如果有一系列具有相似接口的功能,則可能需要修改其他一個或多個功能。 這有點麻煩-特定界面的目的是獲得統一的行為,但是如果行為不統一,則幾乎沒有好處。
該代碼將數據格式化為低位字節序。 不過,它在小字節序和大字節序的計算機上都可以工作。
奇怪的是,該函數采用uint64_t
然后僅轉換uint32_t
的數據值。
這種問題是好的函數注釋真正可以解決的地方。
函數是采用指針還是指針指針取決於其實際功能。
unsigned char *output = malloc(128);
encode(2,32,&output);
因此,問題是...編碼是否會改變輸出的值? 如果您傳遞NULL進行編碼,也許它會分配自己的緩沖區? 也許這是將來需要添加的功能?
是否將緩沖區作為指針或指針指針傳遞,實際上取決於方法的概念目的,而不取決於實現。 根據經驗,您希望盡可能少地取消引用。 因此,在所有條件都相同的情況下,最好使用單指針接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.