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
?
答案 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++));
无效:您指定了两个格式说明符,并且只提供一个。