|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
定义一个整型二维数组 代码如下:
#include<stdio.h>
int main()
{
int i,j;
int a[3][4] = {{1},{2},{3}};
printf("a[1]=%p\n*(a+1)=%p\n*a=%p\na=%p\n*a+1=%p\n",a[1],*(a+1),*a,a,*a+1);
printf("a+1=%p\n&a[1]=%p\n",a+1,&a[1]);
return 0;
}//为什么(a+i)和*(a+i)地址一样;但通过数组索引输出只能*(*(a+i)+j)而不能用*((a+i)+j);
首先,让我们看一下这段代码中每个指针和地址的含义:
- a 是二维数组的首地址,即数组 a[0] 的首地址,它表示的是第一个一维数组的地址;
- *a 是第一个一维数组的首元素,即 a[0][0];
- a+1 是第二个一维数组的地址,即数组 a[1] 的首地址;
- *(a+1) 是第二个一维数组的首元素,即 a[1][0];
- *a+1 是第一个一维数组的第二个元素,即 a[0][1];
现在我们来解释为什么 (a+i) 和 *(a+i) 的地址一样。
首先要明确的是,这两者的值是一样的,但类型是不同的。(a+i) 的类型是一个指向一维数组的指针,
而 *(a+i) 的类型是一个指向整型的指针。因为数组名在大多数情况下会被转换为指向其首元素的指针,所以它们的值相等。
然后,让我们解释为什么我们可以使用 *(*(a+i)+j),但不能使用 *((a+i)+j) 来表示数组中的元素。在这里:
- *(a+i) 是第 i 个一维数组的首元素;
- *(*(a+i)+j) 是第 i 个一维数组的第 j 个元素,即 a[i][j];
- (a+i) 是指向第 i 个一维数组的指针;
- ((a+i)+j) 是试图将整数 j 添加到指向一维数组的指针中,这是不正确的,因为这里的加法没有意义;
因此,我们应该使用 *(*(a+i)+j) 来表示二维数组中的元素 a[i][j]。
|
|