通过代码解释:
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int*)(&aa + 1);
int *ptr2 = (int*)(*(aa + 1));//6的地址。
int *ptr3 = (int*)((aa + 1));
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1),*(ptr3-1));
}
输出答案分别为10,5,5,这是为什么呢,下面是我的理解:
1. &数组名代表的是整个数组的地址,给&数组名+1,则其指向数组元素中最后一个元素的下一个地址,就本题来说,其指向元素10的下一个地址空间;所以*(ptr1 - 1)==10.
2. 二维数组可以看成是一维数组,如本例中aa[3]={a[0],a[1]}即可以将aa[2][5]看成具有2个元素的一维数组,所以在本题中(aa+1)其指向的是a[1],而指向了a[1]其实就指向了a[1]所代表的一维数组,即也同时指向了数组中的元素6,7,8,9,10,所以(*(aa+1))给(aa+1)解引用之后,它会降级,原来指向的是整个一维数组,现在它指向的是第一个元素。所以*(ptr2-1)==5,*(ptr3-1)==5
其实,我们只要掌握了数组名在不同条件下的含义,我们就可以很灵活的去使用它了。
sizeof(数组名)和&数组名,只有这种情况下,数组名才是数组名,其余的情况,数组名都当地址处理。