[英]Please Explain the Output?
任何人都可以解释程序的strage输出我知道该值与存储在数组中的值无关,但与指针有关,但第二个值是如何变为5:
int main()
{
int **h;
int a[2][2]={1,2,3,4};
h=(int **)a;
int i,j;
printf("%d",*h);
(*h)++;
printf("\n%d",*h);
getch();
return 0;
}
发生的事情是*h
是int*
类型,它是一个指针。
当你增加它时实际上会增加4而不是1.因此你最后打印的数字是1 + 4 = 5
。
这是你的代码有更多的打印:
int **h;
int a[2][2]={1,2,3,4};
h=(int **)a;
cout << h[0] << endl;
cout << h[1] << endl;
cout << h[2] << endl;
cout << h[3] << endl;
int i,j;
printf("%d",*h);
(*h)++;
printf("\n%d",*h);
cout << endl;
cout << h[0] << endl;
cout << h[1] << endl;
cout << h[2] << endl;
cout << h[3] << endl;
输出是:
00000001
00000002
00000003
00000004
1
5
00000005
00000002
00000003
00000004
因此,您可以看到第一个值,增加4.因为4是编译为32位时指针的大小。
通过声明h=(int **)a;
你只分配了数组a
到h
的内存地址(第一个)。 您还将h定义为指向指针的指针 , 指针也可以指向二维数组。 另外,为了可以看出,还没有作出h
一个二维阵列 (使用malloc
递归地)。 通过printf("%d",*h);
,您正尝试访问存储在h
中的地址的值。
数组以两种方式将值存储在内存中,无论是按列还是按行 。 无论哪种方式,内存位置都是顺序的,在您的情况下也是如此。 因此, h
存储数组a
的第一个元素的内存地址。 因此,当您使用*h
它会检索存储在h
中的地址的值,即数组a
的第一个值。 而当你增加*h
按(*h)++
,它增加因为*h
仍然是一个指针,如你所知递增一个指针并不意味着通过递增1
, 实际上,它递增4
。
因此,您获得了上述的输出。
Ankit欢迎您进一步讨论。
- Sandip
由于表达式*h
是指针类型,因此指针算法起作用。 请记住,指针算法会考虑基类型的大小; 对于任何类型为T *p
指针,表达式p++
将使指针p
前进一个sizeof T
字节的sizeof T
。
由于*h
是一个初始化为值1的指针,因此表达式(*h)++
被读作“add sizeof (int *)
bytes to 1”,在你的情况下显然为4.因此输出为5。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.