在 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
我的建议是在这种情况下始终使用括号以避免混淆。
现在开始每个案例:
案例一
a++
指针运算。 Post-递增 a
案例二
**a++
被解析为**(a++)
- 它post递增
a
- 指针算法
- 计算
(a++)
的结果是a
- 递增前的值
- 那么你有一个双重间接寻址。
所以上面的内容等同于(或多或少)以下内容:
**a;
a = a + 1;
案例三
a += n
指针运算。我希望不言自明。
案例 4
**a += n
这被解析为
(**a) += n
因此,您在 a
上执行双重间接寻址,获取指向整数的值,然后增加该整数(整数算术)。
我在理解这两种递增指针方式的区别时遇到了问题:
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
我的建议是在这种情况下始终使用括号以避免混淆。
现在开始每个案例:
案例一
a++
指针运算。 Post-递增 a
案例二
**a++
被解析为**(a++)
- 它post递增
a
- 指针算法 - 计算
(a++)
的结果是a
- 递增前的值 - 那么你有一个双重间接寻址。
所以上面的内容等同于(或多或少)以下内容:
**a;
a = a + 1;
案例三
a += n
指针运算。我希望不言自明。
案例 4
**a += n
这被解析为
(**a) += n
因此,您在 a
上执行双重间接寻址,获取指向整数的值,然后增加该整数(整数算术)。