在 C 中使用 ** 和不使用 ** 递增指针的区别

difference in incrementing pointer with ** and without in C

我在理解这两种递增指针方式的区别时遇到了问题:

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

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

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

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

我认为让你困惑的是:

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

这是由于operator precedence

我的建议是在这种情况下始终使用括号以避免混淆。

现在开始每个案例:

案例一

a++

指针运算。 Post-递增 a

案例二

**a++

被解析为**(a++)

  • 它post递增a - 指针算法
  • 计算(a++)的结果是a - 递增前的值
  • 那么你有一个双重间接寻址。

所以上面的内容等同于(或多或少)以下内容:

**a;
a = a + 1;

案例三

a += n

指针运算。我希望不言自明。

案例 4

**a += n

这被解析为

(**a) += n

因此,您在 a 上执行双重间接寻址,获取指向整数的值,然后增加该整数(整数算术)。