一、多维数组地址和指针的关系int arr2[4][2]={{1,2},{3,4},{5,6},{7,8}};
printf("arr2=%p,&arr2[0]=%p,arr2[0]=%p,&ar2r[0][0]=%p\n",arr2,&arr2[0],arr2[0],&arr2[0][0]);
arr[0][0] (1) |
arr[1][0] (3) |
arr[2][0] (5) |
arr[3][0] (7) |
arr[0][1] (2) |
arr[1][1] (4) |
arr[2][1] (6) |
arr[3][1] (8) |
上面的程序的结果输出竟然都一样。为什么呢?
首先 arr2 代表的是arr2数组的首地址,所以 arr2的值和 arr2第一个子元素arr2[0]的地址相同,即 &arr2[0];
arr2[0]是含有两个整形元素一维数组的首地址,即&arr2[0][0]的值。
简单的说:arr[0]是一个整数大小对象的地址,arr2是两个整数大小对象的地址。因为整数和两个整数组成的数组开始于同一个地址,所以 arr2 和 arr2[0] 具有相同的数值。
二、指针(地址)运算和多维数组的关系printf("arr2+1=%p,arr2[0]+1=%p\n",arr2+1,arr2[0]+1);
现在我们知道,arr2 和 arr2[0]具有相同的数值,但是arr2+1和arr2[0]+1为什么数值不一样呢?这是因为,arr2指向的对象大小是两个int,儿arr2[0]所指向的大小是一个int。所以arr2+1的值要比arr2[0]+1的值多一个int大小。
三、使用*对多维数组取值因为 arr2[0] 是 arr2[0][0]的首地址,所以 *(arr2[0])代表存储在arr2[0][0]的值。同样,arr2是arr2[0]的首地址,*arr就是 arr2[0]的值。但是 arr2[0]也是一个地址,即&arr2[0][0],因此*arr2是 &arr2[0][0]。所以 *&arr2[0][0] 等价于 **arr2。*&arr2[0][0] 可以简化为 arr2[0][0]。所以 arr2[0][0]==**arr2。
简而言之:arr2是地址的地址,所以需要经过两次取值才能取到具体的数值。
学完这个知识点,才发现在指针确实很难懂。