带有**和不带有C的递增指针的差异

时间:2018-10-08 23:27:52

标签: 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

我试图在此处以相反的顺序打印程序的参数

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

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

1 个答案:

答案 0 :(得分:7)

我认为这使您感到困惑:

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

这是由于operator precedence

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

现在开始处理每种情况:

案例1

a++

指针算术。后增量a

案例2

**a++

解析为**(a++)

  • 它以a递增-指针算法
  • (a++)求值的结果是a-增量之前的值
  • 然后您有一个双向间接访问。

因此,以上内容等同于(或多或少)以下内容:

**a;
a = a + 1;

案例3

a += n

指针算术。我希望自己能不言自明。

案例4

**a += n

这被解析为

(**a) += n

因此,您对a进行了两次间接访问,以获取指定整数的值,然后增加该整数(整数算术)。