清除混淆:指向指针

时间:2014-03-18 14:18:36

标签: c pointers

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

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);

3 个答案:

答案 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;类似的代码,则将指针传递给指针是没有意义的。我能想到传递指针指针的唯一原因是:

  1. 您需要修改/返回指针(如*outputdata = p;中所示)。
  2. 您需要符合特定的功能原型或界面。
  3. 没有简单的方法可以发现后者是原因,但是如果有一系列具有类似接口的函数,那么其他一个或多个函数可能需要修改输出。这是一个延伸 - 特定界面的点是获得统一的行为,但如果行为不统一,那么它就没什么好处。

    代码将数据格式化为little-endian字节序列;但它在小端和大端机器上的工作方式相同。

    奇怪的是,该函数需要uint64_t,然后只转换uint32_t的数据。

答案 2 :(得分:0)

这种问题是好的功能评论真正有用的地方。

函数是否应该使用指针或指针指针取决于它应该做什么。

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

所以,问题是......编码更改输出值吗?如果你传递NULL来编码,它可能会分配自己的缓冲区吗?也许这是一个在未来添加有意义的功能?

缓冲区是否应该作为指针或指针指针传递,实际上取决于方法的概念目的,而不是实现。但是,作为经验法则,您希望尽可能少地取消引用;所以事情都是平等的,更喜欢单指针界面。