打印指针指针的值

时间:2017-10-29 14:03:47

标签: c pointers

我试图围绕“指针指针”。我尝试了一些实验,我被困在这里一段时间了:

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.我是否误解了任何基本知识或其他内容。 谢谢你的阅读。

4 个答案:

答案 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)取消引用它时,您会非法访问,程序崩溃。