我试图围绕“指针指针”。我尝试了一些实验,我被困在这里一段时间了:
int array[5] = {4 , 5 ,6 ,7 ,8};
int *p = array;
int **pp = &p;
for ( int i = 0; i < 4; i ++)
{
printf("\nprinting\n");
printf("Source: %d\n", array[i]);
printf("Output by pointer: %d, %d\n", p[i], *(p + i));
printf("Output by pointer to a pointer: %d, %d\n", *pp[i], **(pp + i) );
}
我得到了这个输出:
printing
Source: 4
Output by pointer: 4, 4
Output by pointer to a pointer: 4, 4
printing
Source: 5
Output by pointer: 5, 5
我不明白为什么在1循环之后,程序停在第2循环线9.我是否误解了任何基本知识或其他内容。 谢谢你的阅读。
答案 0 :(得分:2)
将最后printf
更改为:
printf("Output by pointer to a pointer: %d, %d\n", (*pp)[i], *(*pp + i) );
您基本上使用*pp
代替p
,但*
运算符的分组不像[]
那么紧密,因此您需要在pp
中使用括号第一种形式。在第二种形式中,您需要在添加i
之前取消引用function sumArray(array) {
return array.reduce(function(result, item) {
return result + item;
})
}
,然后取消引用结果。
答案 1 :(得分:2)
对于初学者来说,目前还不清楚为什么在循环中使用了幻数4而不是数字5,这是数组中元素的数量
for ( int i = 0; i < 4; i ++)
^^^^^
指针pp
未指向数组的第一个元素。它指向一个对象
int **pp = &p;
所以这些表达
*pp[i] (that is equivalent to *(pp[i] )
和
**(pp + i)
没有意义。
使用指针p
的表达式可以使用pp
之类的指针*pp
来编写。
所以这些正确的表达
p[i]
和
*(p + i)
可以使用指针pp
以下列方式编写(只需将p
替换为考虑操作优先级的*pp
)
( *pp )[i]
和
*( *pp + i )
答案 2 :(得分:0)
你通过指针到指针的过程是错误的: 你必须以数组的形式访问指针:
int array[5] = {4 , 5 ,6 ,7 ,8};
int *p = array;
int **pp = &p;
for ( int i = 0; i < 4; i ++)
{
printf("\nprinting\n");
printf("Source: %d\n", array[i]);
printf("Output by pointer: %d, %d\n", p[i], *(p + i));
printf("Output by pointer to a pointer: %d, %d\n", (*pp)[i], *(*pp + i) );
}
答案 3 :(得分:0)
此行错误
printf("Output by pointer to a pointer: %d, %d\n", *pp[i], **(pp + i) );
您需要将其更改为
printf("Output by pointer to a pointer: %d, %d\n", (*pp)[i], *(*pp + i) );
以便在将双指针用作普通指针之前取消引用。
你可以这样想:
p与(* pp)
相同
换句话说 - 在使用p
的有效表达式中,您可以用p
替换(*pp)
。那是
p[i] --> (*p)[i]
*(p + i) --> *((*pp) + i) --> *(*pp + i)
请注意,括号很重要。括号可以在第二个示例中删除,但不能在第一个示例中删除,因为[]
的优先级高于*
。
执行pp + i
会生成一个不指向任何有效对象的指针。因此,当您使用**(pp + i)
取消引用它时,您会非法访问,程序崩溃。