数组指针和指针数组及引用的简单理解.md

a和&a的区别,及指针数组和数组指针的简单理解:

以代码的形式解释:

#include <iostream>
using namespace std;

int main()
{
	//a是数组时,a 和 &a的区别
	int a[5] = { 1,2,3,4,5 };
	int *ptr1 = (int *)(&a+1);
	ptr1--;
	cout << *(a + 1)<<" ";
	cout << *(ptr1) << endl;
	//输出:2 5
	/*
		结果 5 解释如下:
		a是指向数组a的首地址,而&a指向了整个数组a
		所以 &a+1 指向了整个数组后面哪一位(也就是a[4]后面的位置)
		
		由此可以&a可以写成下面形式: int(*p)[5] = &a;
	*/

	int(*p)[5] = &a;
	int *tptr = (int *)(&a+1 );
	cout << p + 1 << " " << tptr << endl;
	//输出:0095FAE4 0095FAE4
	//由此的确证明了 int(*p) [5] = &a

	/*
		那int(*p)[3]与int* p[3]的区别是什么呢(即指针数组和数组指针的区别):
		int(*p)[3] 定义了一个指针变量p,这个指针变量指向了一个含有三个int类型的数组,
		这个指针称为 数组指针,也叫行指针
		int* p[3] 定义了一个数组p,这个数组里面有三个int类型的指针变量(p[0]、p[1]、p[2])
		这样的数组称为 指针数组
		
		int(*p)[3]中 p+1将指向下一行的数组,如果没有下一行,就会执行这一行最后一个元素的后面
		因此可以用p[0]来表示这一行,p[0][i]获取这一行中的数,
		由于只有一行,所以用p[1][i]就会输出不对,下面实践证明:
	*/
	cout << p[0][1] <<" "<<p[0][2]<<" 不存在第二行的情况:"<<p[1][0]<< endl;
	//输出结果: 2 3 不存在第二行的情况:-858993460
	

	//int b[3][3] = { 1,2,3,4,5,6,7,8,9 };
	//int (*ptr2)[3];
	//ptr2 = &b[1];
	//ptr2++;
	//cout << ptr2 [0][1]<<"\t"<< ptr2[1][1] << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值