`
蒙面考拉
  • 浏览: 160536 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二维数组知识

 
阅读更多

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


下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设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;

分享到:
评论

相关推荐

    易语言学习进阶二维数组赋值

    二维数组在编程中是一种非常重要的数据结构,尤其在易语言中,它被广泛应用于各种算法和数据处理场景。本文将详细讲解易语言中二维数组的赋值方法,并通过实例源码帮助你深入理解这一概念。 二维数组,顾名思义,是...

    C++一维数组二维数组写入txt,从txt中读取数据存到一维数组二维数组

    本教程将重点讲解如何使用C++将一维和二维数组的数据写入文本文件(txt),以及如何从txt文件中读取数据并存储到一维和二维数组中。数组在C++中是基本的数据结构,而指针则为动态操作提供了便利。以下是一些关键知识...

    C语言二维数组编程练习

    在C语言中,二维数组是处理表格数据的一种基础方式,它本质上是一组一维数组的集合,每个一维数组代表数组的一行。本编程练习旨在加深对C语言中二维数组、指针和函数的理解,通过实际操作提升编程技能。下面我们将...

    动态二维数组 c#编程

    在C#编程中,动态二维数组是一种非常重要...以上就是关于C#编程中动态二维数组的基本知识,希望对你理解和使用动态二维数组有所帮助。在实际编程中,应根据具体需求选择合适的数据结构,以实现最优的性能和代码可读性。

    将二维数组进行线性插值

    以下是关于二维数组和线性插值的详细知识: 二维数组在计算机科学中,是一个多维数据结构,它由一串连续的内存位置组成,这些位置代表了按行和列排列的元素。每个元素可以通过一对索引(行索引和列索引)来访问。...

    二维数组表单提交

    总结起来,这个项目涉及到的主要知识点包括:二维数组的使用、JQuery进行DOM操作、递归处理数据结构以及使用Ajax提交表单数据。这些技术在Web开发中非常常见,特别是对于需要处理用户输入和动态数据的交互式应用程序...

    VBA二维数组重定义

    在Excel VBA编程中,二维数组是一个非常重要的概念,它允许我们存储和处理多行多列的...通过观看`VBA二维数组重定义.flv`这个视频教程,可以深入理解并掌握这一主题,同时结合实际编程练习,将理论知识转化为实际技能。

    用二维数组实现杨辉三角

    在IT领域,尤其是在编程与数据结构的学习中,杨辉三角是一个经典的示例,它不仅展示了数学之美,也考验了程序员对二维数组的理解和运用能力。本文将深入解析如何使用二维数组来实现杨辉三角,同时确保输出结果不会...

    c++二维数组ppt资源

    C++二维数组PPT资源 C++二维数组是数组的一种扩展形式,相比一维数组,它可以存储更多的数据,并且提供了更多的操作方式。二维数组的定义和使用与一维数组类似,但它具有更多的维度和灵活性。 二维数组的定义 二...

    c程序将表格数据读取到二维数组

    "C 语言读取 Excel 表格数据到二维数组" C 语言是一种广泛使用的编程语言,它可以用于读取 Excel 表格数据并将其存储到二维数组中。下面我们将详细介绍如何使用 C 语言实现此功能。 标题解释 "c 程序将表格数据...

    数据结构与算法 一维数组-二维数组-三维数组

    在本主题中,我们将深入探讨一维数组、二维数组和三维数组的概念,以及如何使用模板来实现这些数据结构。这些基础知识在编程中至关重要,尤其是在处理大量数据时。 一维数组是最基础的数据结构之一,它是一个有序的...

    javascript构造二维数组

    在JavaScript中,构造二维数组是常见的操作,尤其是在处理表格数据、棋盘游戏或者复杂的...通过理解以上知识点,你将能够熟练地在JavaScript中创建、操作和管理二维数组,为各种复杂的数据结构和算法实现打下坚实基础。

    c++return返回二维数组

    在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...

    实验七 二维数组

    ### 实验七 二维数组知识点解析 #### 一、二维数组的基本概念 在C语言中,二维数组可以被看作是一组一维数组的集合,它通常用来表示矩阵或者表格等具有行和列结构的数据。二维数组的声明方式是:`类型标识符 数组名...

    易语言二维数组分页

    在易语言中处理二维数组分页是常见的操作,尤其是在处理大量数据时,为了提高程序性能和用户体验,通常会采用分页的方式来展示数据。 二维数组在易语言中是用于存储多维数据的结构,它由多个一维数组组成,每个一维...

    根据二维数组的第一列数值大小排序

    首先,二维数组是数组的一种扩展形式,它是由多个一维数组组成的,每个一维数组可以看作是二维数组的一行。在二维数组中,每个元素通常由两个索引来定位,第一个索引代表行,第二个索引代表列。例如,我们可以用 `...

    java二维数组的理解

    ### Java二维数组的理解 在Java中,二维数组是一种特殊的数组结构,它由多个一维数组组成,形成一个矩阵形式的数据...通过本文的学习,相信读者已经能够熟练掌握Java二维数组的相关知识,并能够在实际项目中灵活运用。

    二维数组求最大数

    ### 二维数组求最大数知识点解析 #### 一、题目背景与目标 本实验的目标是在一个二维数组中找出最大数及其所在的行和列位置。这是一个经典的编程问题,旨在帮助学习者掌握二维数组的基本操作以及如何在数组中进行...

    C++二维数组编程实例.zip

    下面我们将详细探讨二维数组的相关知识点。 1. **定义二维数组**: 在C++中,二维数组可以看作是一组一维数组的集合,每个一维数组称为行。二维数组的定义格式如下: ```cpp 数据类型 arrayName[行数][列数]; `...

Global site tag (gtag.js) - Google Analytics