zoukankan      html  css  js  c++  java
  • 二维数组---指针数组和数组指针

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

    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;
    }
  • 相关阅读:
    编程语言的发展趋势及未来方向 目录 编程语言的发展趋势及未来方向 1 第一章 一、历史回顾及趋势概述 2 第一节 首先,编程语言的发展非常缓慢。oo等等,但是远没有好上1000倍。 3 第二节 出现
    Atitit datatype 数据类型 目录 第一章 三大基本类型 数字 字符串 bool 1 第二章 基本类型vs引用类型 1 字符串类型 2 第三章 符合类型vs 简单类型 2 特殊类型
    Atitit 乔姆斯基分类 语言的分类 目录 1.1. 0 –递归可枚举语法 1 1.2. 1 –上下文相关的语法 自然语言 1 1.3. 2 –上下文无关的语法 gpl编程语言 1 1.4. 3
    桁架系统控制
    Pset_RoofCommon
    Pset_ShadingDeviceCommon
    Pset_SlabCommon
    gis数据下载地址
    Pset_StairCommon
    Pset_StairFlightCommon
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/7406931.html
Copyright © 2011-2022 走看看