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

来源:互联网 发布:青岛网络企业排名 编辑:程序博客网 时间:2024/04/30 05:02

对于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(){//例子1int Test[3]={1,2,3}; // 若果 int Test[4]={1,2,3,4}就错误了,因为B只能指向有3个元素的数组int (*B)[3];B=&Test;cout << **B <<endl;//1cout << *(*B+1) <<endl;//2B++;cout <<**B <<endl;//-858993460 已经在数组外了//例子2int 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; //1cout << *(*p+1) <<endl; //2cout << *(*p+2) <<endl; //3//p+1是第二行的首地址//*(p+1)+1是第二行的第1个元素地址cout << *(*(p+1)+0) <<endl;//4cout << *(*(p+1)+1) <<endl;//5cout << *(*(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];

附图一张:


0 0
原创粉丝点击