5

在代码中,我通常会使用:

#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. */
...
4

3 回答 3

13

我不知道您的真正意图是什么,但在我看来,您需要了解*p++(*p)++作为表达式之间的区别。

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

第二个表达式取消引用指针并通过应用后缀运算符修改指向的值++。指向的值是指针还是整数都无关紧要。

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

编辑:

假设它blah是 type char **,这里列出了可能的操作以及每个操作的列表:

  • 显然,blah产生一个类型的值char **
  • *blah产量char *
  • **blah产量char
  • *(*blah)++取消引用blah以获得 a char *,然后*p++类比就来了。
  • **blah++取消引用blah两次以获取指向的值,然后递增blah指针。
  • (**blah)++两次取消引用blah指针,然后(*p)++类比来了。
于 2013-01-25T16:05:59.350 回答
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;
} 
于 2013-01-25T17:01:24.667 回答
0

我认为 . 没有任何问题dref1

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

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

这样做是没有意义的,(*blah)++;您只是在增加和丢失由 . 返回的地址malloc

于 2017-01-10T05:55:07.807 回答