二维数组与指针、指针数组、数组指针的用法

二维数组与指针、指针数组、数组指针的用法二维数组和指针 用指针表示二维数组元素 要用指针处理二维数组 首先要解决从存储的角度对二维数组的认识问题 我们知道 一个二维数组在计算机中存储时 是按照先行后列的顺序依次存储的 当把每一行看作一个整体 即视为一个大的数组元素时 这个存储的二维数组也就变成了一个一维数组了 而每个大数组元素对应二维数组的一行 我们就称之为行数组元素 显然每个行数组元素都是一个一维数组下面我们讨论指针和二维数组元素的

二维数组和指针⑴ 用指针表示二维数组元素。
要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组

下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设p是指向二维数组a[m][n]的指针变量,则有:

int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。

如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0];  

则p+j将指向a[0]数组中的元素a[0][j]。

由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j             相应的如果用p1来表示,则为*(p1+i)+j
元素a[i][j]相应的指针表示为:
*( p+i*N+j)         相应的如果用p1来表示,则为*(*(p1+i)+j)
同样,a[i][j]也可使用指针下标法表示,如下:
p[i*N+j]
例如,有如下定义:
int a[3][4]={
{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]也就可以表示为:*( p+1*4+2)
用下标表示法,a[1][2]表示为:p[1*4+2]
特别说明:
对上述 二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;而a是一个 二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。 当用int *p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请读者务必注意。
⑵ 用 二维数组名作地址表示数组元素。
另外,由上述说明,我们还可以得到 二维数组元素的一种表示方法:
对于 二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。因此,*a与a[0]等价、*(a+1)与a[1]等价、*(a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为:
*(*(a+i)+j)
指向该元素的指针为:
*(a+i)+j

数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。

第一,指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。

第二,数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。

例4 求 二维数组元素的最大值。

p=a;

(4)指针数组的定义

指针数组是指每个元素中存放的是指针。定义为 int *p[4];sizeof(p)=16,返回的是数组的总空间
























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205371.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:11
下一篇 2026年3月19日 下午6:11


相关推荐

  • Mybatis中Like 的使用方式以及一些注意点

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。使用Springboot简单配置一下Mybatis,然后进行说明。Springboot集成Mybatis这里就不做介绍了。初始数据方式一在Mybatis中的第一种写法: <!–有sq…

    2022年2月28日
    50
  • 豆包怎么生成ppt图片教程

    豆包怎么生成ppt图片教程

    2026年3月12日
    1
  • es6 扩展运算符 三个点(…)

    es6 扩展运算符 三个点(…)1 nbsp 含义扩展运算符 spread 是三个点 它好比 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列 console log 1 2 3 123console log 1 2 3 4 5 12345 document querySelecto div lt div gt amp

    2026年3月19日
    2
  • vs2010 产品密钥[通俗易懂]

    vs2010 产品密钥[通俗易懂]YCFHQ9DWCYDKV88T2TMHG7BHP转载于:https://www.cnblogs.com/qiwu1314/p/8466855.html

    2022年5月3日
    76
  • 视图索引创建

    视图索引创建下面的脚本给我们的视图建立索引 CREATEUNIQUE BillsViewONd ViewCollater Id LoanNo 为表明已经给视图建立一个索引 并且它确实占用数据库的空间 运行下面的脚本查明聚集索引有多少行以及视图占用多少空间 EXECUTEsp spaceused dbo ViewColla

    2026年3月17日
    2
  • 稀疏数组(最详解)「建议收藏」

    稀疏数组(最详解)「建议收藏」概念当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模 如下图:左边是原始数组,右边是稀疏数组代码实现publicclassSparseArray{publicstaticvoidmain(String[]args){//创建一个二维数组11*110:没有棋子,1:黑..

    2025年7月17日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号