C中1d和2d数组之间的差异

时间:2014-02-22 11:53:42

标签: c arrays

 int arr[3][2]={{1,2},{3,4},{5,6}};
 int *c=&arr;
 for(i=0;i<3;i++)
 {
      for(j=0;j<2;j++)
      {
          printf("\n %d %d",((arr+i)+j),*(*(arr+i)+j));
      }             
 }
 for(i=0;i<6;i++)
 {
      printf("\n%d",(c++));
 }

output:
 2293536 1
 2293536 2
 2293552 3
 2293552 4
 2293568 5
 2293568 6

 2293536
 2293540
 2293544
 2293548
 2293552

我无法理解这一点:为什么一维数组与2d不一样?两者都像线性阵列一样存储。 arr[1][0](arr+0)+1不同。为什么地址在arr

中有所不同

1 个答案:

答案 0 :(得分:2)

arr[1][0](arr+0)+1不同 - 它从未被认为是。 arr[1][0]相当于*(*(arr+1)+0),或者,如果您指的是地址,则&arr[1][0]*(arr+1)+0相同。

因此,您的printf错了:

printf("\n %d %d",((arr+i)+j),*(*(arr+i)+j));

请记住,由于arr是一个3 x 2的数组,arr+x距离2*sizeof(int)个字节。因此,您打印的地址与您取消引用的地址不匹配。 arr+i+j不是*(*(arr+i)+j)的地址。

如果您想打印地址后跟其中的内容,您应该使用此代码:

printf("\n %p %d", (void *) *(arr+i)+j,*(*(arr+i)+j));

请注意格式说明符%p。它必须是*(arr+i)+j,而不是(arr+i)+j,因为*(arr+i)的类型为int * - 它是指向arr[i]中第一个元素的指针。

您的第二次printf电话:

printf("\n %d %d",(c++));

无效:您指定了两个格式说明符,并且只提供一个。