二维数组和指针⑴
用指针表示二维数组元素。
要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组
下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设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;
发表评论
-
set容器的反向迭代器
2013-05-02 16:56 3742#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2181很多人对CRITICAL_SECTION ... -
Realloc的使用
2012-08-14 11:04 828realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 695时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 938分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3109静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1428对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 830学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
编程笔记(07-24)
2012-07-24 15:15 6661 #include < stdio.h ... -
堆、栈解疑
2012-07-12 21:53 583一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 1030一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1185先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2119指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 738typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 594【函数指针】 ... -
Define学习
2012-07-11 10:12 1073宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6671、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10961.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
指针深究
2012-07-09 21:55 593在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例: ... -
C语言文件使用方式详解
2012-07-04 10:23 768文件的打开(fopen函数) f ...
相关推荐
二维数组在编程中是一种非常重要的数据结构,尤其在易语言中,它被广泛应用于各种算法和数据处理场景。本文将详细讲解易语言中二维数组的赋值方法,并通过实例源码帮助你深入理解这一概念。 二维数组,顾名思义,是...
本教程将重点讲解如何使用C++将一维和二维数组的数据写入文本文件(txt),以及如何从txt文件中读取数据并存储到一维和二维数组中。数组在C++中是基本的数据结构,而指针则为动态操作提供了便利。以下是一些关键知识...
在C语言中,二维数组是处理表格数据的一种基础方式,它本质上是一组一维数组的集合,每个一维数组代表数组的一行。本编程练习旨在加深对C语言中二维数组、指针和函数的理解,通过实际操作提升编程技能。下面我们将...
在C#编程中,动态二维数组是一种非常重要...以上就是关于C#编程中动态二维数组的基本知识,希望对你理解和使用动态二维数组有所帮助。在实际编程中,应根据具体需求选择合适的数据结构,以实现最优的性能和代码可读性。
以下是关于二维数组和线性插值的详细知识: 二维数组在计算机科学中,是一个多维数据结构,它由一串连续的内存位置组成,这些位置代表了按行和列排列的元素。每个元素可以通过一对索引(行索引和列索引)来访问。...
总结起来,这个项目涉及到的主要知识点包括:二维数组的使用、JQuery进行DOM操作、递归处理数据结构以及使用Ajax提交表单数据。这些技术在Web开发中非常常见,特别是对于需要处理用户输入和动态数据的交互式应用程序...
在Excel VBA编程中,二维数组是一个非常重要的概念,它允许我们存储和处理多行多列的...通过观看`VBA二维数组重定义.flv`这个视频教程,可以深入理解并掌握这一主题,同时结合实际编程练习,将理论知识转化为实际技能。
在IT领域,尤其是在编程与数据结构的学习中,杨辉三角是一个经典的示例,它不仅展示了数学之美,也考验了程序员对二维数组的理解和运用能力。本文将深入解析如何使用二维数组来实现杨辉三角,同时确保输出结果不会...
C++二维数组PPT资源 C++二维数组是数组的一种扩展形式,相比一维数组,它可以存储更多的数据,并且提供了更多的操作方式。二维数组的定义和使用与一维数组类似,但它具有更多的维度和灵活性。 二维数组的定义 二...
"C 语言读取 Excel 表格数据到二维数组" C 语言是一种广泛使用的编程语言,它可以用于读取 Excel 表格数据并将其存储到二维数组中。下面我们将详细介绍如何使用 C 语言实现此功能。 标题解释 "c 程序将表格数据...
在本主题中,我们将深入探讨一维数组、二维数组和三维数组的概念,以及如何使用模板来实现这些数据结构。这些基础知识在编程中至关重要,尤其是在处理大量数据时。 一维数组是最基础的数据结构之一,它是一个有序的...
在JavaScript中,构造二维数组是常见的操作,尤其是在处理表格数据、棋盘游戏或者复杂的...通过理解以上知识点,你将能够熟练地在JavaScript中创建、操作和管理二维数组,为各种复杂的数据结构和算法实现打下坚实基础。
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
### 实验七 二维数组知识点解析 #### 一、二维数组的基本概念 在C语言中,二维数组可以被看作是一组一维数组的集合,它通常用来表示矩阵或者表格等具有行和列结构的数据。二维数组的声明方式是:`类型标识符 数组名...
在易语言中处理二维数组分页是常见的操作,尤其是在处理大量数据时,为了提高程序性能和用户体验,通常会采用分页的方式来展示数据。 二维数组在易语言中是用于存储多维数据的结构,它由多个一维数组组成,每个一维...
首先,二维数组是数组的一种扩展形式,它是由多个一维数组组成的,每个一维数组可以看作是二维数组的一行。在二维数组中,每个元素通常由两个索引来定位,第一个索引代表行,第二个索引代表列。例如,我们可以用 `...
### Java二维数组的理解 在Java中,二维数组是一种特殊的数组结构,它由多个一维数组组成,形成一个矩阵形式的数据...通过本文的学习,相信读者已经能够熟练掌握Java二维数组的相关知识,并能够在实际项目中灵活运用。
### 二维数组求最大数知识点解析 #### 一、题目背景与目标 本实验的目标是在一个二维数组中找出最大数及其所在的行和列位置。这是一个经典的编程问题,旨在帮助学习者掌握二维数组的基本操作以及如何在数组中进行...
下面我们将详细探讨二维数组的相关知识点。 1. **定义二维数组**: 在C++中,二维数组可以看作是一组一维数组的集合,每个一维数组称为行。二维数组的定义格式如下: ```cpp 数据类型 arrayName[行数][列数]; `...