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

    这片文章介绍二维数组int a[ i ] [ j ]中的符号:a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含义,重点在后面第二部分的分析,但是前面第一部分的复习数组指针,指针数组和二维指针是前提,前面的不会,后面的没法理解。这片文章写的有些费劲,个人能力不够,可能会有错误,希望各位朋友能够指正,共同进步。//握手

    一:先回顾一下数组指针,指针数组,二维指针

    先根据逐层分析分方法分析下面的代码
    (1)int (*p)[5];
    (2)int *p[5];
    (3)int **p;

    看到上面的定义方式一一分析
    分析(1)
    第一步:找核心,核心是p
    第二步:由p向外一层分析,p和*结合是指针,再和[]结合,所以int (*p)[5] 是数组指针

    分析(2)
    第一步:找核心,核心是p
    第二步:由核心p向外一层分析,p先和[]结合是数组,数组中元素是*类型,所以int *p[5];是指针数组。

    分析(3)
    第一步:找核心,核心是p
    第二步:由p向外一层分析,p先和结合是指针,然后*p再和结合是指针的指针,即二重指针。

    (4)二重指针和指针数组
    二重指针就是指针数组指针(有点乱哈)

    先看指针数组 int *p[5];
    (1)p是一个数组,数组有5个元素,每个元素都是int*类型
    (2)指向int * 类型的指针不就是int**嘛
    (3)得出结论,二重指针就是指针数组指针。

    二:二维数组和指针的纠缠

    先定义一个二维数组 int a[ i ] [ j ];
    a是二维数组数组名,把二维数组看成一个平面。i表示有i行,j表示每行有j列。有一个一维数组int a[ 10 ],写成二维数组就是int a[ 2 ] [ 5 ],把10个元素分成2组,每组有5个元素。i表示第一维表示有多少组,j表示每组有多少元素。

    符号含义 int a[ 2 ][ 5 ];int a[ i ] [ j ];

    跟着思路一步一步走

    第一维表示有2个一维数组分别是 a[ 0 ]和a[ 1 ](也就是a[ i ]和a[i+1])
    第二维表示在这两个数组中分别有5个元素。

    那么第一个问题来了

    两个数组的数组名是谁?

    对,a[ i ]和a[i+1] 既然a[ i ]和a[ i+1 ] 是一维数组名

    那么第二个问题来了?

    a[ i ]和a[ i+1 ]类型是什么?

    一维数组数组名做右值表示数组首元素的首地址,首元素是int,首元素的地址是int * ,&b做右值表示整个数组的首地址,类型是int(*)[]
    int b[10];
    int *p;
    p = b;

    所以 a[i]这个数组名做右值表示数组首元素的首地址,首元素是一个数组,首元素的地址,数组的首地址是int * ,&a[i]表示整个数组的首地址(这个整个数组时指包含两个数组的那个数组)

    !!这里很重要:
    迷惑1:a[i]做右值不是表示数组首元素的首地址吗?首元素是一个数组,那么其类型应该是数组的指针啊,类型是int( * ) [ ];

    解答:a[i]这个数组名做右值确实表示数组首元素的首地址,比如int b[10];数组名b做右值表数组首元素的首地址,也就是相当于&b[0],那再二维数组中,a[ i ]和a[i+1]分别是两个数组,每个数组有5个int元素,这么一想就是了:a[ 0 ]这个数组名做右值时等价于&a[0][0],第1个数组的
    第1个元素,第一个元素是int类型,所以a[ i ]是int* 类型的指针。&a[ i ]表示整个数组(包含i个数组的大数组)的首地址,也就是看的是a[ i ]和a[ i+1 ]这两个数组的首地址,所以&a[ i ]的类型才是数组指针,int( * ) [ ];二维数组名a和&a[ i ]类型一致。

    二维数组的运算
    int b[ 10 ];
    下标访问b[ 1 ]
    指针访问* ( b+1)

    int a[ 2 ] [ 10 ]
    下标访问a[ 1 ] [ 1 ]
    指针访问* ( * (a+1)+1)

    分析:a是二维数组的数组名,在这肯定做右值,a做右值等价于&a[0]也就是第一个数组的首地址,(总共有两个数组),类型是int(*)[];这时候当a+1时,a指向谁?a是数组指针,a肯定指向数组,这时候a+1,偏移量为a[i]这个数组的大小,指向了a[1]这个小数组。每个小数组有5个元素,大小是一个int。这时候j的偏移量就是一个int的大小。

    总结:
    (1)int a[ i ][ j ];二维数组表示有i个小数组,没个小数组有j个元素。
    (2)a[ 0 ]做右值表示& a[ 0] [ 0 ]
    &a[ 0 ]做右值和二维数组名a做右值含义一样。
    (3)a[ i ][ j ]表示每一个元素,每一个元素都是int类型的。
    &a[ i ] [ j ]表示int* 类型的指针。
    (4)a[ i ] [ j ] 等价于 * (* (a+i)+j)

    二维数组比较难理解,难道真的是只可意会不可言传?虽然写了这篇文章,但总感觉不是很对,以我目前的水平无法找出错误,请高手指点。//感谢

  • 相关阅读:
    三维坐标变换习题
    1 Introduction and Roadmap
    快讯:2019 OOW 文档已提供下载
    过了35岁,90%以上DBA都在迷茫:未来要何去何从?
    深度学习入门笔记(五):神经网络的编程基础
    《算法图解》学习笔记(十):K 最近邻算法(附代码)
    LNMP环境搭建之php安装
    LNMP环境搭建之php安装
    LNMP环境搭建之php安装
    (PSO-BP)结合粒子群的神经网络算法以及matlab实现
  • 原文地址:https://www.cnblogs.com/1024E/p/13209621.html
Copyright © 2011-2022 走看看