【发布时间】:2015-05-15 02:54:12
【问题描述】:
我知道如果arr 是一个数组那么arr[i]=*(arr+i);如果是二维数组,那么arr[i][j]=*(*(arr+i)+j);所以我有这个代码
main(){
int arr[5][5];
int arr2[25]; // same as arr[5][5];
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++){
arr[i][j]=i+j;
printf("arr[%d][%d] is at %p\n",i,j,&arr[i][j]);
}
printf("*(arr+i)=%d\n",*(arr+1)); // why this dont work
for(i=0;i<24;i++){
arr2[i]=i;
printf("arr2[%d] is at %p\n",i,(arr2+i));
}
printf("*(arr+i)=%d\n",*(arr2+1)); // prints 1 as expected
}
我知道在 C 中没有二维数组之类的东西,它基本上是一个线性行主要连续的内存块。所以我想知道为什么我不能使用 *(arr+1) 打印 2D arr 的值,这意味着将 1*5*4 字节添加到 arr 的基数并取消引用该地址的值。我知道**(arr+1) 有效,但我不知道为什么我需要那个额外的星号?另外,如果我这样做printf("*(arr+i)=%p\n",*(arr+1)); 与我将使用(arr+i) 解释为地址相同
【问题讨论】:
-
魔法药水多了会怎样?
-
每一个都有Obelix吗?
-
这是什么黑魔法?
标签: c arrays pointers memory-management