二维数组知识
- 博客分类:
- C系列
二维数组和指针⑴
用指针表示二维数组元素。
要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组
下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设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 3673#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2088很多人对CRITICAL_SECTION ... -
Realloc的使用
2012-08-14 11:04 780realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 661时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 890分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3049静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1385对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 777学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
编程笔记(07-24)
2012-07-24 15:15 6221 #include < stdio.h ... -
堆、栈解疑
2012-07-12 21:53 533一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 979一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1130先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2067指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 663typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 531【函数指针】 ... -
Define学习
2012-07-11 10:12 1002宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6331、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10411.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
指针深究
2012-07-09 21:55 538在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例: ... -
C语言文件使用方式详解
2012-07-04 10:23 707文件的打开(fopen函数) f ...
相关推荐
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
有学习C语言的同学可以试试做这个题目,涉及到指针,函数,二维数组的相关知识,里面附带本人自己写的代码(vs2008环境),不足的地方望多提意见。
二维数组 基本操作 学习目标 1 进一步熟记对二维数组元素 的访问; 2 掌握以矩阵形式输出二维数 组元素; 3 掌握求二维数组所有元素和 的操作; 学习目标 4 掌握求二维数组正对角线元 素和的操作; 55 了解求二维...
JAVA 用二维数组编写的一个扫雷游戏,绝对可以用!界面简洁美观!
下面将详细介绍二维数组初始化的相关知识和代码示例。 二维数组的概念 二维数组本质上是一个数组的数组,即数组中的每个元素都是一个数组。它可以用来表示表格、矩阵等具有两个维度的数据结构。二维数组由行和列...
二维数组及操作 创建二维数组 JavaScript Web前端开发技术 二维数组及操作 创建二维数组 创建二维数组的两种常见方式的用法: var info = new Array( new Array('Tom', 13, 155), new Array('Lucy', 11, 152) ); ...
内容涵盖了vector的定义、使用vector创建二维数组的几种方法、二维vector的注意事项、优缺点、实际应用、面试题和社区支持等高级知识点。 **适用人群:** 本教程适合所有准备学习C++中vector创建二维数组的初学者,...
二维数组的初始化 学习目标 课程导入 1 熟记二维数组元素访问的方法; 2 掌握二维数组初始化的简写方法; 学习目标 课程导入 3 掌握使用双重循环遍历二维数组的方法; 4 了解使用输入值给二维数组初始化的方法 5 ...
生成一副扑克牌,这副扑克牌具有52张,4种不同的花色,可以对这副新的扑克牌进行洗牌、发牌的操作
c语言二维数组初始化
二维数组 2-1-1 二维数组的定义 类型说明符 数组名[常量表达式1][常量表达式2]; 数组只有一个下标,称之为一维数组,多维数组元素有多个下标,以标识 它在数组中的位置,所以也称为多下标 变量。 常量表达式1表示第...
数组使用,含一维、二维数组赋值、调用等使用方法。
详细描述一维、二维、三维数组动态申请内存的方法,需要具备基本的c++语言知识
本文给大家介绍PHP 二维数组和三维数组的过滤,涉及到php三维数组变二维数组的相关知识,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
先查看二维数组:[9 8 7 1 2 3 5 4 6;10 11 12 13 14 15 16 17 18] 再:reshape([9 8 7 1 2 3 5 4 6;10 11 12 13 14 15 16 17 18],[3 3 2]) 5.总结:reshape([数组],[行 列 页]) 理解为:将数组重新按序排列为一维...
二维数组 2-2 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。 按行分段赋值 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}} 当初值行个数或...
这是一个关于学习二维数组与结构体的PPT,里面包含了二维数组与结构体的编码规则以及各类知识点,同时还有相关例题及详解,PPT末页的例题可以到本人博客中进行查询链接(寒假培训—二维数组,寒假培训—结构体)同时...
主要介绍了详解C++中的一维数组和二维数组,是C语言入门学习中的基础知识,需要的朋友可以参考下
【Python学习-列表-类-循环】【剑指offer】之二维数组中的查找基础知识二维数组中的查找测试结果c++版本 基础知识 Python中关于数组及len的操作详情可参考link,link。 二维数组中的查找 题目: 在一个二维数组中...
PHP程序设计-3期(KC016) 3.1.1二维数组拓展知识.doc 学习资料 复习资料 教学资源