对于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
}
要记住啊int(*p)[3];
附图一张: