我已经执行了一个程序并找到了输出。但是我对程序的运行不满意。
o / p代码:
1 1 1
2 2 2
3 3 3
3 4 4
我在代码中放入了以下代码和查询。
#include <stdio.h>
#include <conio.h>
int main( )
{
static int a[ ] = {0,1,2,3,4};
int *p[ ] = {a,a+1,a+2,a+3,a+4};
int **ptr = p;
ptr++;
printf("%d",*ptr); //It displays me the output for the this line as -170 why?
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*ptr++;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*++ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
++*ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
}
答案 0 :(得分:1)
您在此处打印a[1]
的地址,因为* ptr指向[1]元素
所以
printf("%u",*ptr); // prints the address of a[1] element
printf("%u",&a[1]); // check this statement you will get the same values
要打印该值,请使用*
之类的其他printf("%d",**ptr);
打印a[1]
1
值 a[0] -> 0 a[1] -> 1 a[2] -> 2 a[3] -> 3 a[4] - > 4
1000 1004 1008 2012 2016 -> Addresses
p[0] -> 1000 p[1] -> 1004 p[2] -> 1008 p[3] -> 2012 p[4] -> 2016
4000 4004 4008 4012 4016 -> Addresses
ptr - > 4000
8000 -> Address
<强>考虑强>
ptr++ ==> ptr = ptr + 4 ; ptr = 4000 + 4 -> ptr = 4004
so printf("%u %u %u %u",&ptr,ptr,*ptr,**ptr);
&ptr prints address of ptr 8000
ptr prints address of p[1] 4000
*ptr prints value in p[1] 1004 (value in p[1] is address of a[1])
**ptr prints value of a[1] 1
这就是你的前3个stataments中发生的事情。现在
{{1}}
答案 1 :(得分:0)
你基本上给了printf
一个指针,这可能会导致看似随机的值(它包含一个内存地址)。如果你想给printf提供指向的东西的值,你必须取消引用它两次而不是一次(这应该会产生预期值)。
答案 2 :(得分:0)
int * p [] - &gt;是一个指针数组 内存结构就像
p(0x100)------>p[0](0x200)
++
p[1](0x204)
++
p[2](0x208)
ptr=p
++
ptr+1 will be (0x104)
如果是你的程序,ptr ++将指向p的下一个地址。这是因为p是这里的数组,并且数组是连续的。当你取消引用它时,它将打印p数组的下一个值,即+ 1