在理解这两种增加指针的方式方面的区别时,我遇到了一个问题:
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);
}
总结问题-为什么第二种方法不一样?
答案 0 :(得分:7)
**a++
被解析为**(a++)
,而
**a += n
被解析为(**a) += n
我的建议是在这种情况下始终使用括号,以免造成混淆。
现在开始处理每种情况:
a++
指针算术。后增量a
**a++
解析为**(a++)
a
递增-指针算法(a++)
求值的结果是a
-增量之前的值因此,以上内容等同于(或多或少)以下内容:
**a;
a = a + 1;
a += n
指针算术。我希望自己能不言自明。
**a += n
这被解析为
(**a) += n
因此,您对a
进行了两次间接访问,以获取指定整数的值,然后增加该整数(整数算术)。