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])
……

指向二维数据的一行的指针,比如说:
int array1[2][5]={
{0,1,2,3,4},
{ 4,5,6,7,8}
};
二维数组行指针

array1[0]
array1[1]
都是行指针


C语言中“二维数组行指针”是什么意思?
数组名就是一个指针常量,它代表数组元素在内存相关信息。1、C语言 是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。2、C语言的发明 20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell ...

c语言中二维数组哪个是行,哪个是列
1、二维数组的第一个参数是行,第二个参数是列。二维数组定义的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2],其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。2、C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、...

C语言中“二维数组行指针”是什么意思
从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。第一,来详细介绍二维数组与指针的关系。- 首先定义个二维数组 ...

C语言中的二维数组的为什么横可以为0,列不可以为0啊?
C语言中的二维数组行和列的下标都是可以为0。例如 a[0][1] 或者 a[1][0] 或者a[0][0]都是有效的数组元素。只有在定义二维数组的时候有如下的限制:不可以第⼀维和第⼆维的长度都不指定。⾄少指定第⼆维的长度。原因:⼀维数组存放在⼀段连续的...

c语言中二维数组如何交换行?
1、可以直接找到数组对应行的元素,进行交换数据,改变原数组内容。2、可以定义指针数组指向每行的首地址,交换指针地址,按顺序打印每个指针为首的行数据,得到数据交换效果,原数组内容不变。我这里用第2种方法给你写了一个,你参考吧。include <stdio.h>int main (){ int nArry[4][4]={{1,...

C语言如何求一个二维数组有几行,还有为什么会提示gets()是一个未定...
C语言中求一个二维数组有几行的方法如下:假设有定义int nums[10][20];二维数组行数可以用sizeof计算:rows = sizeof(nums)\/sizeof(nums[0]);第二个问题,为什么gets会提示未定义标识,有两种可能:一、编译器支持gets库函数,但是你没有包含头文件#include<stdio.h>;二、编译器本身不支持gets库...

在C语言中,二维数组元素在内存中的存放顺序是 A按行存放 B按列存放 C...
但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。例如:float a[3][4...

C语言中二维数组找到每行的最大值?
int maxArr[M] = { 0 }; \/\/声明一个含有M个元素的一维数组来存储M个行最大值 for (i = 0; i < M; i++){ int max = a[i][0]; \/\/先将每一行的第一个数作为最大值 for (j = 1; j < N; j++) \/\/找出行最大值 if (max < a[i][j])max = a[i][j];maxArr[i...

c语言如何定义二维数组
二维数组定义的一般形式是:dataType arrayName[length1][length2];其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。例如:int a[3][4];定义了一个 3 行 4 列的二维数组,共有 3×4=12 个元素,数组名为 a,即:a[0][0], a...

C语言中 二维数组行与行如何交换
\/\/如3行4列 int mat[3][4]={0};\/\/换1,2行:for(x=0;x<3;x++){ tmp = mat[x][1];mat[x][1] = mat[x][2];mat[x][2] = tmp;}

昌图县17373609347: C语言中“二维数组行指针”是什么意思? -
栋岩盐酸: 数组名就是一个指针常量,它代表数组元素在内存相关信息.1、C语言 是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行...

昌图县17373609347: C语言中二维数组行指针是什么
栋岩盐酸: 就是指向每一行的指针,比如说二维数组a[2][3]; a[0]代表的是二维数组第零行的首地址相当于&amp;a[0][0]; a[1]代表的是二维数组第一行的首地址相当于&amp;a[1][0]; a[0]+1代表的是二维数组第零行,第一列的地址相当于&amp;a[0][1]

昌图县17373609347: C语言什么叫行指针?它与数组指针有什么联系和不同点?
栋岩盐酸: 数组指针就是一个数组的地址, 行指针出现在二维数组里就是是二级指针那里附近,例如 int a[10][5]; 那么二维数组可以可分为行和列,那么要找到每一个数组就要通过哪行和哪列查找,a[10][10]中第一个小标表示行,第二个下标表示列,那么 a[1],a[2]表示对应行的指针,记得在二维数组中约定a[1],a[2]表示的是指针,在一维数组中a[1],a[2]表示的是元素,我知道你云里雾里的这里比较难记住既可以了,不要问为什么,记得这是语法规定的就可以了

昌图县17373609347: c语言中,二维数组中行指针可以理解为指向指针的指针么 -
栋岩盐酸: 在操作 以及调用的时候 可以这样理解. 取元素的时候,按照这个理解没有错误. 但是,实际上有区别. 最大的体现就在于自加自减. 指向指针的指针,每次自加移动的是一个指针大小的空间, 而数组指针,也就是行指针,移动的是一行.

昌图县17373609347: 介绍下二维数组的指针(c语言) -
栋岩盐酸: 请参考下~~ a[i]从形式上看是a数组中的第i个元素.如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元的内容.a[i]是有物理地址的,是占内存单元的.但如果a是二维数组,则a[i]是代表一维数组名.它只是一个地址(如同一维数组...

昌图县17373609347: c语言中的列指针是指向元素的指针吗,怎么区别行指针与列指针 -
栋岩盐酸: 二维数组的数组名a和a+1、a+2是行指针,它指向的元素是一个包含4个元素的一维数组,而*a、*(a+1)、*(a+2)是列指针,即指向元素的指针,相当于一维数组中指向特定元素的指针.*(*(a+1)+2)是先竖着走一行,再横着走两行,相当于a[1][2].&a[1][0]就是a[1][0]的地址,相当于*(a+1),是一个列指针.

昌图县17373609347: c语言中,指针数组和行指针的区别是什么? -
栋岩盐酸: 简单的说就是一个是指向数组的指针,一个是数组成员是一族指针 具体哪个是哪个我也时常分不清楚.但用起来就知道了

昌图县17373609347: c语言中,指针数组和行指针有什么区别啊 -
栋岩盐酸: 指针数组 一个数组的成员都是指针它就是指针数组了 至于指向的是什么东东要在定义时就说好了的 行指针 二维数组用的东西 比如 a[5][5] a[0]就是一个行指针 也是a[0]这一行的这个一维数组的首地址 也就是说a[0]的地址和a[0][0]的地址还有a是同...

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

昌图县17373609347: C语言问题
栋岩盐酸: 指针数组是c语言中对数组的另外一种称呼,在c语言中所有的数组操作对可以通过指针来进行,并且效率更高.因此经常将数组称为指针数组.行指针是二维数组中,指向某行的指针.如果学过矩阵,二维数组就可以说成矩阵,行就表示矩阵中的行,行指针就是指向矩阵中某行的指针.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网