数组指针和指针数组的理解

指针数组

元素全是指针的数组,申明方式: int* p[5] 。   这里的p是个数组,只不过存储的元素为指针,声明方式相当于(int*) p[5], 这里的int* 和 char, int, float 一样是一种类型——整型指针。
int a[5] = { 1,2,3,4,5 };
int* k[5];
k[0] = a; k[1] = &a[0] ; k[0]=a[1];

数组指针

数组指针是一个指向数组的指针,申明方式比如:int (*p)[5]。其实我认为这里应该称作p为一个有维度的指针,这里的维度是5,即 p+1 是p加上5个int型地址的长度,用公式表示可能更明白点,这里的1 = 5*sizeof(in*)。其实二维数组名也可以看作一个有维度的指针,int a[1][5] 和 int b[2][5]里的 ab都是一个维度为5的指针。同样,假设有一维数组 int k[5],对数组名k取地址得到的也是一个有维度的指针, &k的类型即是一个维度为5的指针,有 p = &k
这种有维度的指针的类型是:type(*)[dimen] 。 比如 int(*p)[5]中p的类型就是int(*)[5];  char  s[3][4]里s的类型可看作是char(*)[4] 。这里其实有一点歧义,实际上 数组名的类型跟对应的指针类型其实并不是一个类型。
数组名包含的含义要多得多,比如int a[4][5], 对a取址得到的指针类型是int(*)[4][5],即一个指向二维数组int [4][5]的指针;而int(*p)[5]中对p取值得到的指针类型是int(**)[5]。另外,sizeof得到的结果也完全不一样。

int b[5]       --------->   sizeof(b) = 5*sizeof(int) = 5*4 = 20  
int a[4][5]   --------->   sizeof(a) = 4*5*sizeof(int) = 20*4 = 80   
int (*p)[5]   --------->   sizeof(p) = 4    (就是指针类型的大小)
int **m       --------->   sizeof(m) = 4    (同上)

        int a[5] = { 0,1,2,3,4 };
	int sequen[5][5] =
	{
		{ 00, 01, 02, 03, 04 },
		{ 10, 11, 12, 13, 14 },
		{ 20, 21, 22, 23, 24 },
		{ 30, 31, 32, 33, 34 },
		{ 40, 41, 42, 43, 44 },
	};
	
	int(*pp)[5];
	pp = &a;
	cout << "(*pp)[3] = " << (*pp)[3] << endl;   //result: 4
	cout << "pp[3] = " << pp[3] << endl;         //result: 003DF8B4  (地址)
	cout << "pp[0][2] = " << pp[0][2] << endl;   //result: 2

	int(*p)[5] = sequen;
	cout << "(*p)[3] = " << (*p)[3] ;            //result: 3
	cout << "p[3][3] = " << p[3][3] ;            //result: 33   
	cout << "(*(p+2))[3] = " << (*(p + 2))[3] ;  //result: 23   

	int(*ppp)[5];
	ppp = sequen;
	int(**g)[5] = &ppp;
	cout << "(*g)[1][3] = " << (*g)[1][3]<<endl; //result: 13   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值