如何增加一个解除引用的双指针?

时间:2013-01-25 15:59:27

标签: c pointers dereference

在代码中我通常会使用:

#include <stdlib.h>

void dref1(char **blah)
{
    (*blah)[0] = 'a';
    (*blah)[1] = 'z';
    (*blah)[2] = 0x00;
}

/* or */

void dref2(char **blah)
{
    char *p = *blah;

    *p++ = 'w';
    *p++ = 't';
    *p = 0x00;
}


int main(void)
{
    char *buf = malloc(3);

    dref1(&buf);
    puts(buf);
    dref2(&buf);
    puts(buf);
    free(buf);

    return 0;
}

我的问题是,是否有可能/如何取消引用并直接递增指针:

**blah = 'q';       /* OK as (*blah)[0] ? */
(*blah)++;          /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
...

3 个答案:

答案 0 :(得分:11)

我不知道你的真实意图是什么,但在我看来,你需要将*p++(*p)++之间的差异理解为表达式。

第一个表达式取消引用指针并使指针本身前进,而不是指向的值。

第二个表达式取消引用指针并通过应用postfix ++运算符修改指向的值。指向的值是指针还是简单的整数并不重要。

这与一元*运算符和后缀++运算符的优先级有关。如果没有括号,则首先应用++运算符,并将其结果用作*运算符的操作数。

编辑:

假设blah的类型为char **,这里列出了可能的操作以及每个操作的内容:

  • 显然,blah会产生类型char **;
  • 的值
  • *blah收益char *;
  • **blah收益char;
  • *(*blah)++取消引用blah获取char *,然后*p++类比来。
  • **blah++取消引用blah两次以获取指向的值,然后递增blah指针。
  • (**blah)++取消引用blah指针两次,然后(*p)++类比来。

答案 1 :(得分:2)

是的,我们可以。只是测试一下垃圾。我想你有这个主意。

使用blah编写方式的问题是,当你回到main时,不仅缓冲区的内容发生了变化(正如你所想的那样),而是指针{{1}本身也是。这可能不是你想要的,也不是你需要释放的东西。

测试:

buf

答案 2 :(得分:0)

我认为dref1没有错。

(*blah)[0] = *(*blah)+0 = **blah

所以你可以写(*blah)[0]='a';

执行(*blah)++;没有意义。您只是递增并丢失malloc返回的地址。