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

Run*_*ium 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bla*_*iev 12

我不知道你的真实意图是什么,但在我看来,你需要学习*p++(*p)++表达之间的区别.

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

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

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

编辑:

假设它blah是类型char **,这里是一个可能的操作列表以及每个操作的内容:

  • 显然,blah产生一个类型的值char **;
  • *blah产量char *;
  • **blah产量char;
  • *(*blah)++解引用blah获得char *,然后*p++比喻来.
  • **blah++取消引用blah两次以获取指向的值,然后递增blah指针.
  • (**blah)++取消引用blah指针两次,然后(*p)++类比来了.


qPC*_*vir 3

我们可以。只需测试一窝。我想你有这个想法。

使用您编写的方式的问题blah是,当您回到 main 时,不仅缓冲区的内容发生了更改(正确地按照您的意愿更改),而且指针buf本身也发生了更改。这可能不是您想要的,也绝对不是您需要释放的。

测试:

#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;
}

void dref3(char **blah)
{
    *(*blah)++ = 'w';
    *(*blah)++ = 't';
    *(*blah) = 0x00;
}

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

}


int main(void)
{
    char *buf = (char*)malloc(3);
    char *buf1=buf;
    dref1(&buf);
    puts(buf);
    dref2(&buf);
    puts(buf);
    dref3(&buf);
    puts(buf);
    puts(buf1);

    buf=buf1;
    dref4(&buf);
    puts(buf);
    puts(buf1);

    free(buf1);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)