数组指针 int(*P)[3] --行数组指针

对于int(*p)[3]和int*p[3]一直迷糊,一直迷糊。

今天总结一下int(*p)[3]

int (*p)[3]是数组指针(其实p是一个二级指针,*p也是指针。p指向数组,*p指向数组的首元素,**p才是首元素的值),p也称为行数组指针。p指向的是一个装有3个int类型一维数组的指针。p+1指向一下一个装有3个数据的一维数组。

p是一个行指针(二级指针),每行有3个in数据。*p是数据1的地址,*p+1是数据2的地址   *p+2是数据3的地址。

int* q;p与q是完全不同的指针了。q是指向的int类型的数据。所以赋值 p=q是错误的。

#include <iostream>
using namespace std;

void main()
{
	//例子1
	int Test[3]={1,2,3}; // 若果 int Test[4]={1,2,3,4}就错误了,因为B只能指向有3个元素的数组
	int (*B)[3];
	B=&Test;
	cout << **B <<endl;//1
	cout << *(*B+1) <<endl;//2
	B++;
	cout <<**B <<endl;//-858993460 已经在数组外了

	//例子2
	int a[]={1,2,3,4,5,6,7,8,9,10};
	typedef int(*A_Type)[3];
	A_Type p;
	p=(A_Type)&a[0];
	cout << **p << **(p+1) <<endl; //1  4  恰好说明p类型的特点。
	//p是行指针,*p指向第一行的首地址
	//*p+0是第一行的第1个元素地址   *p+1是第一行第二个元素地址 *p+2是第一行第三个元素
	cout << *(*p+0) << endl; //1
	cout << *(*p+1) <<endl; //2
	cout << *(*p+2) <<endl; //3
	//p+1是第二行的首地址
	//*(p+1)+1是第二行的第1个元素地址
	cout << *(*(p+1)+0) <<endl;//4
	cout << *(*(p+1)+1) <<endl;//5
	cout << *(*(p+1)+2) <<endl;//6
}



因为是行指针(一行里有3个int类型数据)。让我想到了二维数组。

int a[4][3]  数组a有4个数据(一维数组),每个数组里有3个int型数据。

int a[4][3]={   {11,12,13}  ,  {21,22,23}   ,    {31,32,33}  ,  {41,42,43}}

                       第一个大数据    第二个大数据        第三个大数据     第四个大数据     每个数据里面有3个数据。

理解a[4] ={ {},{},{},{} }。a指向首地址,a+1指向 第二个数据成员,a+2指向第三个,a+3指向第4个。

这时候,发现a 与 int(*p)[3]中的p是一样的类型。所以可以用a给p赋值。

#include <iostream>  
using namespace std;  

void main()  
{  
	int a[4][3]={   {11,12,13}  ,  {21,22,23}   ,    {31,32,33}  ,  {41,42,43}};  
	int (*p)[3];  
	p=a;  
	cout << *(*p+0) <<endl;//11  
	p=p+1;  
	cout << *(*p+0) <<endl;//21  

	/*int(&r)[3]=a[2];// 一个int[3] 类型的引用,指向a中第一个元素
	p=&r;*/ //指针指向这个地址  对引用取地址
	
	p=&a[2];   //直接对a[2]取地址
	cout << **p <<endl;//31
}  


这里只讨论,行数组指针(其实这个指针式二级指针,因为*p还是一个指针。**p才是一维数组的第一个数据的值。

要记住啊int(*p)[3];

附图一张:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值