只是为了清除一些混乱。 我最近遇到了这段代码(使用指针指针):
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);
答案 0 :(得分:0)
我的问题是为什么在这种情况下有必要用上面的双指针来做?
事实并非如此。编写该代码的人显然还不熟悉C语言。让我们解析一下代码:
unsigned char** outputdata
绝对没有理由使用指向指针。(unsigned char)
为什么在包含stdint.h时使用它?使用uint8_t
。*p++ = (unsigned char)type;
演员是多余的。为什么要从unsigned char转换为unsigned char? *p++
而不是试图将尽可能多的运算符压缩到一行,这绝对没有任何好处,写可读代码:
*p = type;
p++;
*p++ = (unsigned char) ((input_length >> (i * 8)) & 0xFF);
可以分成几行。此外,掩蔽是多余的。
*p = (uint8_t) (input_length >> (i * 8));
p++;
答案 1 :(得分:0)
通常情况下,答案可能在于未显示的代码 - 具体而言,可能有一个原因指向代码部分中的指针:
//..
如果该代码包含:
*outputdata = p;
然后它告诉调用函数转换数据的结尾是什么。
如果函数中没有与*outputdata = p;
类似的代码,则将指针传递给指针是没有意义的。我能想到传递指针指针的唯一原因是:
*outputdata = p;
中所示)。没有简单的方法可以发现后者是原因,但是如果有一系列具有类似接口的函数,那么其他一个或多个函数可能需要修改输出。这是一个延伸 - 特定界面的点是获得统一的行为,但如果行为不统一,那么它就没什么好处。
代码将数据格式化为little-endian字节序列;但它在小端和大端机器上的工作方式相同。
奇怪的是,该函数需要uint64_t
,然后只转换uint32_t
的数据。
答案 2 :(得分:0)
这种问题是好的功能评论真正有用的地方。
函数是否应该使用指针或指针指针取决于它应该做什么。
unsigned char *output = malloc(128);
encode(2,32,&output);
所以,问题是......编码曾更改输出值吗?如果你传递NULL来编码,它可能会分配自己的缓冲区吗?也许这是一个在未来添加有意义的功能?
缓冲区是否应该作为指针或指针指针传递,实际上取决于方法的概念目的,而不是实现。但是,作为经验法则,您希望尽可能少地取消引用;所以事情都是平等的,更喜欢单指针界面。