繁体   English   中英

请解释输出?

[英]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;
}

发生的事情是*hint*类型,它是一个指针。

当你增加它时实际上会增加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; 你只分配了数组ah的内存地址(第一个)。 您还将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM