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


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

    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
    ",(*p)[3]);
    
            printf("%d
    ", *(q[0]));
    
            system("pause");
            return 0;
    }
  • 相关阅读:
    Ubuntu Server中怎样卸载keepalived
    Winform中实现ZedGraph滚轮缩放后自动重新加载数据
    Winform中自定义添加ZedGraph右键实现设置所有Y轴刻度的上下限
    C#中获取多个对象list中对象共有的属性项
    Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式
    八、子查询实践
    四、bootstrap-Table
    二、sql新增后返回主键|sql 使用 FOR XML PATH实现字符串拼接|sql如果存在就修改不存在就新增
    一、动词、名词、形容词汇位置
    三、TortoiseSVN 单独拉取项目某个文件
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/7406931.html
Copyright © 2020-2023  润新知