问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中二维数组行指针是什么78

发布网友 发布时间:2024-03-06 12:39

我来回答

4个回答

热心网友 时间:2024-07-23 22:21

先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。
第一,来详细介绍二维数组与指针的关系。-
首先定义个二维数组 array[3][4],p 为指向数组的指针。
若p=array[0],此时p指向的是二维数组第一行的首地址,则 p+i 将指向array[0]数组中的元素array[0][i]。由以上所介绍的二维数组在内存中的存储方式可知,对数组中的任一元素array[i][j] ,其指针的形式为:p+i*N+j (N为每一行的长度)。 元素相应的指针表示法为:*(p+i*N+j) ,下标表示法为:p[i*N+j] 。
For Example:
array[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int * p=array[0];
数组array有四个元素,分别为array[0],array[1],array[2],array[3],每个元素为包含3个元素的一维数组,
如array[0]的3个元素为 array[0][0],array[0][1],array[0][2]。
元素array[2][2]对应指针为:array+2*3+2,
指针表示法为:*(array+2*3+2) ,
下标表示法为:array[2*3+2] 。
特别注意:虽然 array[0] 与 array 都是数组首地址,但两者指向的对象不同,这点要非常明确。array[0] 是一维数组的名字,它指向的是一维数组array[0]的首地址,所以 *array[0]与array[0][0]为同个值。而 array 是二维数组的名字,它指向的是所属元素的首地址,其每个元素为一个行数组。它是以‘行’来作为指针移动单位的,如array+i 指向的是第 i 行。对 array 进行 * 运算,得到的是一维数组 array[0] 的首地址,所以 *array 与 array[0] 为同个值。如果定义 int* p,p为指int类型的指针,指向int 类型,而不是地址。故以下操作 :p=array[0] (正确) ,p=array (错误) 。这点要非常注意。
第二,看看如何用数组名作地址表示其中元素。
对二维数组array ,array[0] 由 array指向,故*array 与array[0] 是相同的,依次类推可得 array[i] 由array+i 指向,*(array+i) 与array[i]是相同的。 因此,对于数组元素 array[i][j] ,用数组名表示为 *(*(array+i)+j) ,指向该元素的指针为 *(array+i)+j 。
注意:数组名虽然是地址,但与指向数组的指针性质不同。指针变量可以随时改变其所指向对象,而数组名不可以,一旦被定义,就不能通过赋值使其指向另外一个数组,但是在Java中则可以。
第三,顺便了解一下不太常用的‘行数组指针’。
对于二维数组array[4][3],与int* p 。二维数组名array 不能直接赋值给p。原因前面已讲过,两只的对象性质不同。 在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值。行数组指针定义如下:
int (*p)[3]; 它表示,数组 *p 具有三个int类型元素,分别为 (*p)[0] , (*p)[1] , (*p)[2] ,即 p指向的是具有三个int类型的一维数组,也就是说,p为行指针。此时,以下运算 p=array 是正确的。
第四,二维数组作为函数参数。
二维数组作为函数参数一般有两种方式:(1) void func(int **array){...} (2) void func(int array[ ][N])
注意第二种方式一定要指明二维数组的列数
当二维数组名作为函数实参时,对应的形参必须是一个行指针变量。
和一维数组一样,数组名传送给变量的是一个地址值,因此,对应的形参也必须是一个类型相同的指针变量,在函数中引用的将是主函数中的数组元素,系统只为形参开辟一个存放地址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组的存储单元。
int main()
double a[3][4];
……
fun(a);
……
fun(double (*a)[n])
……

热心网友 时间:2024-07-23 22:18

行指针其实就是二级指针,也就是说它指向一个一维数组,
int a[2][3];
a[0] a[1] 就是行指针
这么看就明白了
int a[][3]={a[0],a[1]}
而a[0] a[1]本身又是一个数组

热心网友 时间:2024-07-23 22:27

就是指向每一行的指针,比如说二维数组a[2][3];
a[0]代表的是二维数组第零行的首地址相当于&a[0][0];
a[1]代表的是二维数组第一行的首地址相当于&a[1][0];
a[0]+1代表的是二维数组第零行,第一列的地址相当于&a[0][1]

热心网友 时间:2024-07-23 22:20

就是指行的指针,比如指针一开始指第一行,加一就指第二行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 二维数组名和指针的关系41 c语言中二维数组的指针如何表示10 二维数组如何用指针表示180 在生产和生活中,人们主要选择现代的交通运输方式,传统的交通运...10 求帮写一篇校庆晚会记叙文800字,谢谢 ...的校园生活写一篇《这里有我的收获》记叙文 800至850字 白色衣服上弄上了桔子皮上的异物要咋么洗掉? 白色的衣服上有异物(黑色的东西),用什么清洁能干净啊? 白色衣服上有异物,该如何处理? 浙江路桥那里有动车站吗?我要从无锡到路桥应该买到哪里的票?_百度知 ... 光纤熔接机出现光纤分离故障是何原因 酷喵会员可以在几台电视上登录。 ...高中物理而以!求竿上的人下滑过程的最大速度和竹竿长度(需过程... 求物理高手,竖直的一杆长为 L求倒下的时间,杆底部固定并可以自由转动... 高中物理 光滑的底面和墙面上有杆AB 若A点以速度v下滑 求B点的速度 ...下端速度为VB,方向水平向右。求中点O的速度 高一物理题,木棍下滑 如何求杆匀速下滑时速度大小 为什么天津话的声音特别像说相声的?30 哪些相声是用天津话说的? 防撞护栏灯目前在国内实施的工程案例有哪些? 安徽省阜阳市交通违章处理的费用是多少6 阜阳市颍上县交通违章处理时间法律规定有哪些10 阜阳交警直属六大队队长是谁 阜阳市公安局交警投诉热线是多少 从安吉去杭州自驾游的行程可以怎么安排? xp多国语言包如何使用 魅族X2怎么老是自动锁屏? 为什么魅族note突然就闪了一下自动锁屏呢?怎么办 魅族魅蓝note1为什么经常自动锁屏 ...你选一个号码要在开出的20个号码之中,真实概率是多少? (54) 在下列几种排序方法中,要求内存量最大的是___。 A. 插入排序 B... ...归并排序的原理都是是什么?哪个要求内存量最大? ...归并排序,冒泡排序中哪个要求内存量最大?为什么 在下列几种排序方法中,要求买内存量最大的是() A插入排序B选择排序C快速... 口袋妖怪漆黑的魅影茵都镇道馆键子草怎么打 照片怎么添加微信图标和水印 辩论的语言特点有哪些6 学术辩论有什么特点5 辩论的特点11