请解释输出?

时间:2011-09-19 06:19:56

标签: c

任何人都可以解释程序的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;
}

3 个答案:

答案 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.