任何人都可以解释程序的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;
}
答案 0 :(得分:4)
正在发生的事情是*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位时指针的大小。
答案 1 :(得分:0)
通过语句h=(int **)a;
,您只将数组a
的内存地址(第一个)分配给h
。您还将h定义为指向的指针,它也可以像您一样指向二维数组。另外,您可以看到未使h
成为二维数组(递归使用malloc
)。到printf("%d",*h);
,您尝试访问h
中存储的地址的值。
Arrays以两种方式在内存中存储值,列方式或行方式。无论哪种方式,内存位置都是顺序的,在您的情况下也是如此。因此,h
存储数组a
的第一个元素的内存地址。因此,当您使用*h
时,它会检索h
中存储的地址的值,即数组a
中的第一个值。当你将*h
增加(*h)++
时,它会递增,因为*h
仍然是一个指针,如你所知,递增指针并不意味着递增1
,它< strong>实际按4
递增。
因此,您获得了上述的输出。
欢迎您进一步讨论 Ankit 。
- 的的Sandip 强>
答案 2 :(得分:0)
由于表达式*h
是指针类型,因此指针算法起作用。请记住,指针算法会考虑基类型的大小;对于T *p
类型的任何指针,表达式p++
将使指针p
前进sizeof T
个字节。
由于*h
是一个初始化为值1的指针,因此表达式(*h)++
被读作“将sizeof (int *)
字节添加到1”,在您的情况下显然为4.因此,输出5.