二维数组---指针数组和数组指针

以下纯属个人理解,如有错误请指正;

int a[4][3] = { 1,2,3,
      5,6,7,
      9,10,11,
      13,14,15};

int a[4][3]={{1,2,3},

        {4,5,6},

        {7,8,9},

        {10,11,12}};


//要先知道*和[],()的优先级顺序;()>[]>*;

#include <iostream>
using namespace std;
int main()
{
    int a[2][5] = { 1,2,3,4,5,
                    6,7,8,9,10 };
    int (*p1)[2][5];
    int (*p2)[5];
    int *p3;
p1
= &a; p2 = a; p2 = &a[0]; p2 = a + 1; p2 = &a[1]; p3 = a[0]; p3 = &a[0][0]; system("pause"); return 0; }

 

对于二维指针的理解如图所示:

 

理解:上图是一个二维数组a[2][5],将一个二维数组的第一维看作是一个两个元素的数组,数组名为a,元素分别为a[0],a[1];

   然后将a[0]看做是一个含有5个元素的一维数组,其数组名为a[0],数组元素为a[0][0],a[0][1],a[0][2],a[0][3],a[0][4;a[1]的理解与其类似;

   这样,a相当于一个含有两个元素的数组的数组名,也就是第一个元素的首地址,等价于&a[0];但是,类型为:int *[5];

      a[0]就相当于一个含有五个元素的数组的数组名,也就是第一个元素的首地址,等价于&a[0][0],类型为:int *;

      

int *p[3];     //指针数组

//由于优先级顺序,p[]先定义的三个元素的数组;就是说p[0],p[1],p[2]只能存储指针变量的地址;
//然后在执行*,这样就定义了三个指针;

*********************************************************************

1.指针数组:是指向存储指针的数组;

 int a,int b;

 int *p[5]={&b,&a}

 printf("%d",*(p[0])); == printf("%d",*p[0]); 

 

int (*q)[3];     //数组指针
//由于优先级顺序,(*q)先定义的一个q指针;然后以这个指针为首地址,定义了三个元素的数组;


p[0] = &a[0][0];  //二维数组首元素的地址;
q = &a[0];     //这里表示第0行一维数组的首地址;

 

区别:&a;&a + 1 ; a ; *a ; **a ; a+1;*a+1 ; **a+1;

a是二维数组中第一维数组的地址:a = &a[0],那么*a是第一维数组的首地址:a[0],*(*a)是第一维数组第0个元素的值:a[0][0]

&a是二位数组的首地址,其类型为int *[2][5];

&a+1,表示下一个int *[2][5]的二维数组;

 

a,作为数组名,二维数组的第0行一维数组的首地址,其类型为:int *[5];

*a,是第0行一维数组的首元素的地址,其类型为:int *;

**a,是第0行一维数组首元素的值,类型为 int;

a+1,因为a的类型为int *[5],表示的是第1行一维数组(这个一维数组包含5个元素)的首地址;

*(a+1),表示的是第1行一维数组的首元素的地址;

**(a+1),则表示的是第1行首元素的值;

*********************************************************************

1. 数组指针:是指向数组的指针;

 指向数组的指针表示的是:这个指针的内容是整个数组的首地址;

int f[5] = { 1,2,3,4 };
int (*p)[5];
p = &f;

这里定义的数组指针就是p,这里面存储的是整个数组f的首地址;

示例:

#include <iostream>
using namespace std;
int main()
{
        int a = 6, b = 7;
        int f[5] = { 1,2,3,4 };
        int (*p)[5];
        p = &f;
        int *q[5] = { &a,&b };

        printf("%d\n",(*p)[3]);

        printf("%d\n", *(q[0]));

        system("pause");
        return 0;
}

 

posted @ 2017-08-21 22:01  唯一诺  阅读(381)  评论(0编辑  收藏  举报