c语言,指向二维数组的指针变量

时间:2021.11.05 发布人:korgbt

c语言,指向二维数组的指针变量

已解决问题

谷歌korgbt用户在2021.11.05提交了关于“医统江山c语言,指向二维数组的指针变量”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-27T17:23:51。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,滴水之恩,来日我当涌泉相报 !

希望以下的回答,能够帮助你。

第1个回答

用户名:匿名用户  

从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的331215问答。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。

第一,来详细介绍二维数组与指针的关系。-

先定义个二维数组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]。

ForExample:

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]由arra火造全持判y指向,故*array与ar航西少模入希苏ray[0]是相同的,依次类造治况溶仅火部轮推可得array[i]由array+i指向,*(array+i)与ar属民聚技将ray[i]是相同的。因此,对于数组元素array[i][j应体集款极],用数组名表示为*(*(array+i)+j),指向该元素的指针为*(array+i革日画汽第以许)+j。

注意:数组名虽然是地址,但与指向数组的指针性质不同。指针变量可以随时改变其所指向对象,而数组名不可又沿月响以,一旦被定义,就不能通土此段过赋值使其指向另外一个数组,但是在J**a中则可以。

第三,顺便了解一下不太常用的‘行数组指针’。

对于二维数组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)voidfunc(int**array){}(2)voidfunc(intarray[][N])

注意第二种方式一定要指明二维数组的列数

当二维数组名作为函数实参时,对应的形参必须是一个行指针变量。

和一维数组一样,数组名传送给变量的是一个地址值,因此,对应的形参也必须是一个类型相同的指针变量,在函数中引用的将是主函数中的数组元素,系统只为形参开辟一个存放地址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组的存储单元。

intmain()

doublea[3][4];

……

fun(a);

……

fun(double(*a)[n])

……