gpt4 book ai didi

清除困惑: pointer to pointer

转载 作者:行者123 更新时间:2023-11-30 17:37:12 27 4
gpt4 key购买 nike

只是为了消除一些困惑。我最近遇到了这段代码(使用指针到指针):

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]/* input_length 的第一个字节等。 */, 输出[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);

最佳答案

My question is why was it necessary in this case to do it with double pointers above?

事实并非如此。编写该代码的人显然还不熟悉 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++;

关于清除困惑: pointer to pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22482106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com