将指针与**递增而在C中没有递增的区别

Sad*_*aze 1 c pointers increment

我在理解增加指针的两种方式的差异时遇到了一个问题:

int **a;

a++;      //works fine
**a++;    //same here
a += n;   //still good
**a += n; //is not the same and I can't figure out what is going on
Run Code Online (Sandbox Code Playgroud)

我试图在这里以相反的顺序打印程序的参数

int main(int argc, char **argv)
{
    argv += argc;                 //works fine until it is changed to 
                                  //                   **argv += argc
    while (--argc > 0)
    {
        argv--;
        (*argv)--;
        while (*(*argv)++)
            ft_putchar(**argv);
        if (argc - 1 > 0)
            ft_putchar('\n');
    }
    return (1);
}
Run Code Online (Sandbox Code Playgroud)

总结问题 - 为什么第二种方式不一样?

bol*_*lov 7

我认为令你困惑的是:

**a++被解析为**(a++)while
**a += n被解析为(**a) += n

这是由于运营商的优先权

我的建议是在这样的情况下总是使用括号来避免任何混淆.

现在来看每个案例:

情况1

a++
Run Code Online (Sandbox Code Playgroud)

指针算术.后增量a

案例2

**a++
Run Code Online (Sandbox Code Playgroud)

被解析为 **(a++)

  • 它后增量a- 指针算术
  • 评估的结果(a++)a- 增量前的值
  • 然后你有一个双重间接.

所以上述内容与以下内容相同(或多或少):

**a;
a = a + 1;
Run Code Online (Sandbox Code Playgroud)

案例3

a += n
Run Code Online (Sandbox Code Playgroud)

指针算术.我希望不言自明.

案例4

**a += n
Run Code Online (Sandbox Code Playgroud)

这被解析为

(**a) += n
Run Code Online (Sandbox Code Playgroud)

因此,您在a获取指向整数的值时执行双重间接,然后增加该整数(整数运算).