2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > c语言调用函数时二维数组实参 C语言函数调用二维数组 指针问题

c语言调用函数时二维数组实参 C语言函数调用二维数组 指针问题

时间:2019-07-26 01:59:55

相关推荐

c语言调用函数时二维数组实参 C语言函数调用二维数组 指针问题

话题:C语言函数调用二维数组,指针问题回答:正如楼下所言 int **p ,定义的p是一个指向int*型的指针int (*p)[1]是一个指向数组的指针 数度为1假如定义成 deal(int **p),传参数时要加类型转换: deal((int**)a);并且使用p时不能用下标,p[2][3]是错误的,因为不知道p指向的int*型的长度,无法编译成*(p+2*1+3)必须自己写成*(p+2*1+3)来调用假如定义成 deal(int (*p)[1])就不一样了,编译器就能知道p是一个指向长度为1的数组的指针那么p[2][3]就能编译成*(p+2*1+3)了总之,C语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的不知道这么说楼主明白了没?同样的还有多维数组对多维指针的问题,楼主可以自己类推一下

参考回答:int **p是指向int*的指针,int(*p)[1] 是指向数组的指针话题:c语言中怎么用二维数组作为函数参数回答:C语言中 指针做函数参数传递二维数组有两种基本方法:1、传递“数组指针”#include void output( int (*pa)[3], int n ) 这个函数只能输出n行3列的二维数组{int i,j;for( i=;i#include void output( int *pa[], int row,int col ) 这个函数更通用,但调用前,要做好准备。{int i,j;for( i=;ilt;row;i++ ){for( j=;jlt;col;j++ )printf("%d ", pa[i][j] );printf("\n");}}void main(){int a[2][3]={{1,2,3},{4,5,6}};int i;int *pa[2];for( i=;ilt;2;i++ )pa[i]=a[i];output(pa, 2, 3);}话题:c语言 二维数组指针函数问题。回答:你定义的二维数组,数组名并不是一个int **类型的指针,而是一个int (* )[N]类型的指针,其中N是二维数组第2维的长度,如果还不懂可以追问我改成这样就可以了:#include话题:C语言问题,请问二维数组的函数参数是怎么传递的?回答:在形参是数组的情况下,只要是数组,无论维数,实际上在调用函数时,传给函数的将是一个数组的首,以及维数等相关也就是说,在函数执行过程中,并不会新开辟内存空间,而是形参实参共用同一段内存空间所以,在这种情况下,函数内部对数组进行修改,其值会返回给实参你的例中调用部分有问题,不能这样shuru(a[1][2])而是shuru(a)因为a[1][2]数组a中的一个元素,而且是越界的而a才是数组名

参考回答:你好!关于二维数组传参问题,在调用的时候直接传数组指针即可,即:void main(){int a[1][2];shuru(a);shuchu(a);}函数形参有两种写法,可以写成void shuru(int (*array_num)[2]){} 或者void shuru(int array_num[][2]){}函数shuchu() 也是一样,望采纳,如有不明白请追问谢谢!话题:C语言怎么用指针替二维数组回答:设二维数组为typename a[M][N],则指向该数组的指针为typename (*p)[N] = a;这样就可以用p来替二维数组了。

参考回答:展开全部 #includelt;stdio.hgt;void main(){int i,j;int a[3][3],*p=a[]; 相对于一维数组是一样的,a[]本身就是一个一维数组,不要写成*p=a,写成*p=a[][]也可以for(i=;ilt;3;i++)for(j=;jlt;3;j++)scanf("%d",a[i][j]);printf("%d\n",*(p+5)); 调用就直接加数字,该数字是lt;3*3的就行}话题:C语言怎么以二维数组作为参数传递的问题回答:考虑要把a作为参数传入到print中,那么print函数就要定义一个接收二维数组的参数,那么什么参数能接收二维数组呢。就是print(int (*newbuf)[3])然后newbuf的就是a的,然后newbuf[i][j]来访问每一个元素了有问题继续问哈,写的可

参考回答:展开全部 考虑要把a作为参数传入到print中,那么print函数就要定义一个接收二维数组的参数,那么什么参数能接收二维数组呢。就是print(int (*newbuf)[3])然后newbuf的就是a的,然后newbuf[i][j]来访问每一个元素了有问题继续问哈,写的可能不太明白话题:c语言问题,用指针为一个二维数组赋值回答:pptr=arr;/p p其实你这样赋值也是可以的,是没有问题的。/p p因为arr是二维数组的数组名,它(arr)本身就这个二维数组的第行的。/p p问题关键不是出现在这里,而是在你程序的while循环语句中/p pwhile(scanf("%f", ptr+i)i!=)/p pi++;/p p你这样写是不对的,首先ptr指向的是一个,所以ptr+i也是一个,所以这里就不能用变址运算符""了。第二个问题是,i 从自加到6,这里面其实有了个数,明显超过了arr数组的长度,这样是不对的。这个循环还有一个问题就是,这本身就是一个不正常的循环(自己想想为什么)/p p下面是我帮你改改的码,希望对你会有帮助。/p p#includestdio.h/p pvoid main()/p p{/p pdouble arr[2][3];/p pdouble *ptr;/p pint i=;/p pptr=*arr; 把数组arr第行第列的赋给ptr,其作用与ptr=arr;相同,/p p 但不建议采用ptr=arr;这样的赋值 /p pprintf("Plese enter 2*3 numbers: \n");/p pfor(i=;i6;i++)/p pscanf("%lf",ptr+i); 注意不要将ptr+i 写成ptr+i 或(ptr+i),否则出错 /p pfor(i=;i6;i++)/p pprintf("%g ",*ptr++);/p pprintf("\n");/p p}/p p/p话题:C语言中指针引用二维数组元素的问题回答:二维数组名a是一个指向指针的指针。也是一个指针数组名,它含3个元素,a[]a[1],a[2]。虽然a存储的是该数组首元素的,但它指向的并不是一个变量,而是一个指针。应为a是一个指向指针的指针,它指向的是和自己存储的相同的指针,即a[],a[]是第一行一维数组的指针,可以指向具体变量。这下明白了吧,*(a+)它不是变量,她是指针,a指向a[],*(a+)就是a[].

参考回答:呵呵,我也刚学到这个问题,和你分享一下吧,咋看之下,确实像你说的没错,但是这个“[]”运算符和“*()”运算符原来是一个意思的,是不是因为搬到二维数组就混淆了呀,我原来也是有同样的问题的。你看看哪,要是搬回一维数组的话,我们知道a[]与*(a+)是相等的.然后我们再回到二维数组讨论讨论,我认为既然a[][]是二维数组,(a+)怎么看也不可能是二维吧,所以再用“星号”*去取里边的值,换是你,你该怎么取呢?所以呢,它们是相同的应该没错才对,是不是?话题:c语言问题,用指针为一个二维数组赋值回答:pptr=arr;/p p其实你这样赋值也是可以的,是没有问题的。/p p因为arr是二维数组的数组名,它(arr)本身就这个二维数组的第行的。/p p问题关键不是出现在这里,而是在你程序的while循环语句中/p pwhile(scanf("%f", ptr+i)i!=)/p pi++;/p p你这样写是不对的,首先ptr指向的是一个,所以ptr+i也是一个,所以这里就不能用变址运算符""了。第二个问题是,i 从自加到6,这里面其实有了个数,明显超过了arr数组的长度,这样是不对的。这个循环还有一个问题就是,这本身就是一个不正常的循环(自己想想为什么)/p p下面是我帮你改改的码,希望对你会有帮助。/p p#includestdio.h/p pvoid main()/p p{/p pdouble arr[2][3];/p pdouble *ptr;/p pint i=;/p pptr=*arr; 把数组arr第行第列的赋给ptr,其作用与ptr=arr;相同,/p p 但不建议采用ptr=arr;这样的赋值 /p pprintf("Plese enter 2*3 numbers: \n");/p pfor(i=;i6;i++)/p pscanf("%lf",ptr+i); 注意不要将ptr+i 写成ptr+i 或(ptr+i),否则出错 /p pfor(i=;i6;i++)/p pprintf("%g ",*ptr++);/p pprintf("\n");/p p}/p p/p话题:c语言,指向二维数组的指针变量回答:先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。第一,来详细介绍二维数组与指针的。- 首先定义个二维数组 array[3][4],p 为指向数组的指针。若p=array[],此时p指向的是二维数组第一行的首,则 p+i 将指向array[]数组中的元素array[][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},{,,},{1,11,12}}; int * p=array[]; 数组array有四个元素,分别为array[],array[1],array[2],array[3],每个元素为包含3个元素的一维数组,如array[]的3个元素为 array[][],array[][1],array[][2]。元素array[2][2]对应指针为:array+2*3+2,指针表示法为:*(array+2*3+2) , 下标表示法为:array[2*3+2] 。特别注意:虽然 array[] 与 array 都是数组首,但两者指向的对象不同,这点要非常明确。array[] 是一维数组的名字,它指向的是一维数组array[]的首,所以 *array[]与array[][]为同个值。而 array 是二维数组的名字,它指向的是所属元素的首,其每个元素为一个行数组。它是以‘行’来作为指针移动单位的,如array+i 指向的是第 i 行。对 array 进行 * 运算,得到的是一维数组 array[] 的首,所以 *array 与 array[] 为同个值。如果定义 int* p,p为指int类型的指针,指向int 类型,而不是。故以下作 :p=array[] (正确) ,p=array (错误) 。这点要非常注意。第二,看看如何用数组名作表示其中元素。对二维数组array ,array[] 由 array指向,故*array 与array[] 是相同的,依次类推可得 array[i] 由array+i 指向,*(array+i) 与array[i]是相同的。 因此,对于数组元素 array[i][j] ,用数组名表示为 *(*(array+i)+j) ,指向该元素的指针为 *(array+i)+j 。注意:数组名虽然是,但与指向数组的指针质不同。指针变量可以随时改变其所指向对象,而数组名不可以,一旦被定义,就不能通过赋值使其指向另外一个数组,但是在Ja中则可以。第三,顺便了解一下不太常用的‘行数组指针’。对于二维数组array[4][3],与int* p 。二维数组名array 不能直接赋值给p。原因前面已讲过,两只的对象质不同。 在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的质,实现它们之间可以直接赋值。行数组指针定义如下:int (*p)[3]; 它表示,数组 *p 具有三个int类型元素,分别为 (*p)[] , (*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]) ……

参考回答:楼主你好:二维数组的指针不难理解。请参看我的帖:: zhidao.baidu./question/126624 是关于指针的很通俗易懂的解释!有不明白的,我就可以了。:24526倒数第四行*(*(a+2)+2)就等价于你写的*(*board+i))其实就是*board[i]。*board就相当于board[][]的,也就是board[][]

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。