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
原文地址:https://www.cnblogs.com/alwayszzj/p/12483869.html