二维数组和指针

拙园 拙园     2022-10-10     526

关键词:

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


下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设p是指向数组a的指针变量,若有:
p=a[0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j
元素a[i][j]相应的指针表示为:
*( p+i*N+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 求二维数组元素的最大值。


该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int *p,max;
for(p=a[0],max=*p;p<a[0]+12;p++)
   if(*p>max)
      max=*p;
printf("MAX=%d/n",max);
}
执行结果:
MAX=88
这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max=*p将数组的首元素值a[0][0]作为最大值初值;p<a[0]+12是将指针的变化范围限制在12个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。
例5 求二维数组元素的最大值,并确定最大值元素所在的行和列。
本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int *p=a[0],max,i,j,row,col;
max=a[0][0];
row=col=0;
for(i=0;i<3;i++)
   for(j=0;j<4;j++)
     if(*(p+i*4+j)>max)
      {
        max=*(p+i*4+j);
        row=i;
        col=j;
      }
printf("a[%d][%d]=%d/n",row,col,max);
}
程序运行结果:
a[2][1]=88
⑶ 行数组指针
在上面的说明中我们已经知道,二维数组名是指向行的,它不能对如下说明的指针变量p直接赋值:
int a[3][4]={{10,11,12,13},{20,21,22,23},{30,31,32,33}},*p;
其原因就是p与a的对象性质不同,或者说二者不是同一级指针。C语言可以通过定义行数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。行数组指针的定义方法如下:
数据类型 (*指针变量名)[二维数组列数];
例如,对上述a数组,行数组指针定义如下:
int (*p)[4];
它表示,数组*p有4个int型元素,分别为(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4个int型元素的一维数组,即p为行指针

此时,可用如下方式对指针p赋值:
p=a;

指针和二维数组

 array这里指向的是第一行的五个元素 可以证明:    我画了一个图 二维数组指针的结论:①所谓的多维数组其实就是一维数组线性扩展得到的  一道题目:  查看详情

二维数组和数组指针的关系

  昨天既然写了一些关于数组指针的话题,那么今天就写一些关于数组指针的话题吧!  数组指针:这样读数组的指针,即指向数组的指针,就是数组指针,其本质就是一个指针  比如:int(*a)[3];就是一个数组指针,运用... 查看详情

二维数组和它的指针

这片文章介绍二维数组inta[i][j]中的符号:a,&a[i],&a[i][j],a[i][j],&a[i][j]的含义,重点在后面第二部分的分析,但是前面第一部分的复习数组指针,指针数组和二维指针是前提,前面的不会,后面的没法理解。这片文章写的... 查看详情

指针与一维数组和二维数组以及字符串指针数组的学习笔记

...可。说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要,请自行加... 查看详情

二维数组和指针(代码片段)

二维数组和指针,是一个比较难的地方,能力有限,也只能谈谈自己对此略微的认识,如有啰嗦口误之处,多多包涵!!推荐读者先看我的另外两篇文章指针http://www.cnblogs.com/wangweigang/p/8990237.html 数组和指针http://www.cnblogs.com/... 查看详情

二维数组和二级指针(真的没什么关系)

...候,总是会认为,一级指针可以用来访问一维数组,那么二维数组就要用二级指针来访问啦。。。。实际上二级指针和二维数组真的没什么关系,而且,切记千万不要用二级指针访问二维数组。。。。。下面是几个有关的小程序... 查看详情

指针和二维数组

指针一,传值、引用方式//()优先级最高Swap1引用 void swap(int *a, int *b){       int temp;       temp = *a;&n 查看详情

c语言二级指针内存模型(指针数组|二维数组|自定义二级指针|将一二模型数据拷贝到三模型中并排序)(代码片段)

文章目录一、指针数组和二维数组数据拷贝到自定义二级指针中1、函数形参设计规则2、三种内存模型对应函数形参指针退化规则二、完整代码示例一、指针数组和二维数组数据拷贝到自定义二级指针中将指针数组和二维数组中... 查看详情

memcpy()对二维数组和二维指针操作的区别

...义的空间是连续的,并且长度等于你定义的数量你的那个二维指针的空间不一定是连续的,并且使用的空间比你定义的要大以char[2,3]叔祖和二维指针为例,地址都从0x1000看是数组空间地址:dataout[0][0]:0x1000dataout[0][1]:0x1001dataout[0... 查看详情

如何使用 C++ 中的指针动态分配和解除分配二维数组?

】如何使用C++中的指针动态分配和解除分配二维数组?【英文标题】:Howtodynamicallyallocateanddeallocatea2Darrayusingpointersinc++?【发布时间】:2020-10-1413:32:53【问题描述】:我想使用指针动态分配然后解除分配二维数组。我的想法是创... 查看详情

数组参数和指针参数

...传递数组时,将数组名看做常量指针传数组首元素地址3.二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组4.二维数组参数中第一维的参数可以省略5.C语言中无法向一个函数传... 查看详情

C中的二维数组和指针 - 如何访问元素?

】C中的二维数组和指针-如何访问元素?【英文标题】:2DarrayandpointerinC-howtoaccesselements?【发布时间】:2012-06-2412:24:54【问题描述】:我有一个涉及指向二维数组的指针的示例。有人可以帮我理解这个例子中发生了什么吗?intmain(... 查看详情

c语言数组指针&数组名和数组名数组是首元素地址(两特殊情况)数组指针访问二维数组数组指针的使用。

查看详情

二维数据和一维指针数组(代码片段)

1.二维数组名a的含义:定义一个二维数组a:  inta[3][4]=1,3,5,7,9,11,13,15,17,19,21,23;  a数组包含3个行元素,a[0],a[1],a[2]。      每个行元素a[i]又是一个一维数组,它包含4个元素。a==&a[0]a+i==&a[i]a[0]==& 查看详情

二维数组和指向指针的指针

一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char**p,a[6][8];问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#include<stdio.h>voidmain(){char**p,a[6][8];p=a;printf(" ");}编译,然后就会发现通不过,报错... 查看详情

二维数组名和二级指针

1.指针1.1一个指针包含两方面:a)地址值;b)所指向的数据类型。1.2解引用操作符(dereferenceoperator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空... 查看详情

数组的初始化和二维数组指针与数组

1、数组的初始化,比较简单,实例程如下:#include<stdio.h># define M 12int main(void){int days[M]={31,28,31,30,31,30,31,30,30,31,30,31};int i;for(i=0;i<M;i++)printf("Months %d&n 查看详情

二维数组的指针指向记录

三条规律:(一)数组名相当于指向数组第一个元素的指针(二)&E相当于把E的管辖范围上升了一个级别(三)*E相当于把E的管辖范围下降了一个级别注意要点:(一)&和*的优先级要高于+和-(二)指向数组的指针的输出... 查看详情