C 如何增加取消引用的双指针?

C 如何增加取消引用的双指针?,c,pointers,dereference,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 m

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

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

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

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

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

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

编辑:

假设
blah
属于
char**
类型,下面列出了可能的操作以及每个操作将执行的操作:

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

  • 是的,我们可以。试一下。我想你有这个想法

    使用
    blah
    编写方式的问题在于,当您返回main时,不仅缓冲区的内容发生了更改(与您所做的一样正确),而且指针
    buf
    本身也发生了更改。这可能不是你想要的,也肯定不是你需要释放的

    测试:

    #包括
    无效dref1(字符**废话)
    {
    (*blah)[0]=“a”;
    (*blah)[1]=“z”;
    (*blah)[2]=0x00;
    }
    /*或*/
    无效dref2(字符**废话)
    {
    char*p=*blah;
    *p++='w';
    *p++='t';
    *p=0x00;
    }
    无效dref3(字符**废话)
    {
    *(*废话)+='w';
    *(*废话)+='t';
    *(*blah)=0x00;
    }
    无效dref4(字符**废话)
    {
    **布拉赫='q';/*可以(*布拉赫)[0]*/
    (*废话)++;/*为什么不是这个*/
    *((*blah)++)=“w”;/*;或*/
    }
    内部主(空)
    {
    char*buf=(char*)malloc(3);
    char*buf1=buf;
    dref1(和buf);
    put(buf);
    dref2(&buf);
    put(buf);
    dref3(和buf);
    put(buf);
    puts(buf1);
    buf=buf1;
    dref4和buf;
    put(buf);
    puts(buf1);
    免费(buf1);
    返回0;
    } 
    
    我认为
    dref1
    没有问题

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

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


    (*blah)+没有意义
    您只是在递增并丢失由
    malloc
    返回的地址

    对。谢谢我自己才意识到:)。这就是问题所在。一旦我意识到我在做什么,这是非常明显的。测试一下什么,伙计?注意
    **blah++
    正在增加
    buf的地址,这是一个堆栈地址。在这种情况下,在下一个语句中为
    blah
    赋值可能会使堆栈崩溃。
    **blah = 'q';       /* OK as (*blah)[0] ? */
    (*blah)++;          /* Why not this? */
    *((*blah)++) = 'w'; /* ;or. */
    ...
    
    #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;
    }