C语言中二维数组行指针是什么 c语言中二维数组的指针如何表示

作者&投稿:宏典 (若有异议请与网页底部的电邮联系)
先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。
第一,来详细介绍二维数组与指针的关系。-
首先定义个二维数组 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])
……

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

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

就是指行的指针,比如指针一开始指第一行,加一就指第二行

C语言中“二维数组行指针”是什么意思?~

数组名就是一个指针常量,它代表数组元素在内存相关信息。

1、C语言
是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
2、C语言的发明
20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell Laboratory)的研究员Ken Thompson。
3、C语言标准
2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C [9] ,简称C11标准,原名C1X。这是C语言的第三个官方标准,也是C语言的最新标准。

比如定义一个int型的二维数组,如下:
int **p;
或者
int p[MAX_ROW][MAX_LINE];
不同的是前者定义了一个int型二维数组的指针,编写器知道该指针的移动方式以int为单位,但此时该指针为NULL,即没有与内存中的物理单元进行对应。使用指针前需要用malloc()为该指针分配一段内存空间,内存空间的大小在malloc()的参数中指定,系统会为该指针分配一段空闲内存供该指针使用。或者将你的程序中其他int类型的指针赋值给该指针使其映射到内存物理单元。在程序结束或不在需要使用该指针时需要使用free()将该指针所映射内存释放。
后者在定义时为该指针分配了MAX_ROW*MAX_LINE个int大小的空间映射到内存,之后就可以直接使用了。

二维数组如何用指针表示
答:二维数组用指针表示有两种方式:一、动态数组方式。完全由动态数据构成二维数组。如M行N列的数组,先分配M个一维指针空间,然后在每个一维指针上分配N个元素的空间,即成为动态二维数组。和普通数组不同,这种动态二维数组的各行之间地址并不连续。参考代码:include<stdlib.h>int **create(int m, int ...

据图片上的定义,a应该是一个指向一维数组的指针,为何可以有这样的表示a...
答:i]x[i]又是一维数组名,则有:×[i]==&x[i][0]×[i]+1==&x[i][1]……×[i]+j==&x[i][j]故 (×[i]+j)==x[i][j],*(*(×+i)+j)=x[i][j]此时x的值为&x[0],称为二维数的行指针,指向整个二维数组第一行的。二维数组行指针的定义为:int (*x)[5]...

C语言二维数组的地址为什么 不可以赋值给指针变量?
答:二维数组的数组名和一维数组的数组名不一样。一维数组名a表示其首地址,指针类型是(int *)。二维数组名d表示其行指针,指针类型是(int (*)[7])。所以你要定义指针去用二维数组名赋值,需要定义指针int (*k)[7];不是int *k。或者你把二维数组当成一维数组来看(二维内部地址是连续的,和...

...列指针四种方法,编写程序,输出一个二维数组的元素。求解
答:}}首先数组的访问有三种形式:1)下标法;2)首地址法;3)指针变量法。这里我们先分析首地址法。假设有一个二维数组a[3][4],a就是首地址,他是一个指针是一个常量,指向第一个元素的地址,也就是指向第一行的首地址,是指首行一整行,并不是指某个具体元素。那么我们称之为“行指针”。同...

c语言指针:a为二维数组,那a[0]是什么类型?是指针还是数组?
答:在二维数组a中,a[0][0]是第一行的第一个元素,a[0]则是指向第一行第一个元素的指针即a[0] = &a[0][0];a是数组名,也是指向第一行的第一个元素的指针所以a = &a[0][0];至于 a = &a[0] ,因为a[0]并不是从 其他地方 弄了个空间保存&a[0][0]; 它就在这个数组的空间里...

...行指针指向哪里,为什么(*p)[]方框里是二维数组的列不是行,他不是...
答:(*p)[X]只是说p是指向一个具有X列的一维数组的指针,指针的类型(就是这个一维数组的元素的类型)有待你声明,X的大小也要你写明确,否则p就不可用;p确实是行指针,是指向一行一维数组的,但一个一维数组的长度不是用列数来表示的吗?至于p指向了哪一行,那要由代码给它赋值了才能知道。比如有int...

C语言指针问题
答:二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。如果有:int a[M][N];则将二维数组中的元素a[i][j]转换为一维线性地址的一般公式是:线性地址=a+i×M+j 其中:a为数组的首地址, M和N分别为二维数组行和列的元素个数。若有:int a[2]...

求C语言高手指点:请问如何指针定义二维数组?? 请用 **p ,(*P...
答:用p3来表示一维数组的各元素,只需要将用p1表示的数组元素*(p1+i)中的p1换成*p3即可,表示为*(*p3+i)。同样,对二维数组b来说,b[i]表示第i行首地址,将其传递给指针变量p2,使其指向该行。该行的元素用p2表示为*(p2+i)。若作p3=&p2,则表示p3指向p2,用p3表示的二维数组第i行元素为:*(*p3+i)。这...

二级指针和二维数组行指针的区别
答:一个是指向指针的指针,一个是指向数组的指针,这是从定义上区别,现在我在外面,手机上不便,回去后给你具体的解答。

c 语言用指针表示二维数组的列 怎样表示
答:定义二维指针,例如:int (*p)[3],a[3][4];p=a;那么指针指向二维数组的列是这样:*(*(p+1)+2)/*指向第二行第三列,即:a[1][2]*/ 就是说,二维指针中*p是把行指针换成列指针。**p才是指向的数值。