C和指针
1.虽然&a和a的地址是同一个地址,但是(&a+1)并不是将指向数组首元素的地址加1,让其指向第二个元素,而是将整个数组加1。&a+1在这就相当于a+sizeof(int)*10,而a+1相当于a+sizeof(int)*5。
2.(int*)是强制类型转换,这里为什么需要强制类型转换,因为类型不匹配, &a是int(*)[5];ptr是 int *类型。
3.*(ptr-1) 又是ptr-sizeof(int)*1 就是原来ptr指向10下一个位置 减一后指向10 *(ptr-2)指向9。
#include<iostream>
using namespace std;
int main()
{
int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};
int *ptr=(int*)(&a+1);
cout<<*(ptr-2)<<endl;
cout<<a<<endl;//数组头指针 第0行
cout<<a+1<<endl; // 第1行 20
cout<<(&a+1)<<endl;// 第2行 40
cout<<ptr<<endl;
cout<<ptr-1<<endl;
cout<<ptr-2<<endl;
cout<<*(ptr-1)<<endl;
return 0;
}
结果
9
0x70fdf0
0x70fe04
0x70fe18
0x70fe18
0x70fe14
0x70fe10
10