用一个二维数组做形参,函数形参 需要定义吗应该怎么定义

只需一步,快速开始
请完成以下验证码
后使用快捷导航没有帐号?
请完成以下验证码
查看: 960|回复: 3
c语言二维数组作为函数参数时的用法
& 尚未签到
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
#include &stdio.h&
#define ROWS 3
#define COLS 4
int sum(int rows,int cols,int ar[rows][cols]);
int main(void)
& & & & int i,j;
& & & & int rs=3;
& & & & int cs=10;
& & & & int junk[ROWS][COLS]={{2,4,6,8},{3,5,7,9},{12,10,8,6}};
& & & & int morejunk[ROWS-1][COLS+2]={{20,30,40,50,60,70},{5,6,7,8,9,10}};
& & & & int varr[rs][cs];&&//变长数组
& & & & for (i=0; i&i++)
& & & & & & & & for (j=0; j& j++)
& & & & & & & & & & & & varr[j]=i*j+j;
& & & & printf(&3x4 array\n&);
& & & & printf(&Sum of all elements=%d\n&, sum(ROWS,COLS,junk));
& & printf(&2x6 array\n&);
& & & & printf(&Sum of all elements=%d\n&,&&sum2d(ROWS-1,COLS+2,morejunk));
& & printf(&3x10 VLA\n&);
& & & & printf(&Sum of all elements=%d\n&, sum2d(rs,cs,varr));
& & & & return 0;
int sum(int rows,int cols,int ar[rows][cols])
//带一个变长数组(VLA)参数的函数
& & & & int tot=0;
& & & & for(r=0; r& r++)
& & & & & & & & for(c=0; c& c++)
& & & & & & & & & & & & tot+=ar[r][c];
}程序运行时很多错误,但如果把int ar[rows][cols]改成 int&&ar【3】【4】这样具体的数据表达就可以了,二维数组作为函数参数传递时不可以这样用吗,rows,cols虽然是变量,但在函数调用时先传递这两个参数进来,不就相当于int ar[rows][cols]中的值是常量了么,还是说高版本的c语言软件才可以这样定义使用。(我的版本是c++6.0).是否可以用指针来代替int ar[rows][cols]。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:13 天连续签到:1 天
数组不能用变量定义,
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:15 天连续签到:1 天
你确定是数组那个地方错了?你想要实现什么功能啊?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 尚未签到
我确定是数组哪里错了,我的目的是对维数可变的数组进行求和,编成函数怎么能传递维数可变的数组呢?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
小甲鱼强烈推荐 /3
“知道自己不懂”是为第一境界
“不知道自己懂”是为第二境界
“知道自己懂了”是为第三境界
编写一个小爬虫,统计淘宝上某一件商品的月销量。
特效不会给你基本工资,但却能让你升职加薪
- - - - - - - - - - - -
有备无患,念念不忘
•••(
Powered by2012年 总版技术专家分年内排行榜第一
2013年 总版技术专家分年内排行榜第七2011年 总版技术专家分年内排行榜第五2009年 总版技术专家分年内排行榜第九
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结 - CSDN博客
C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
#include&iostream&int&& fun(int a[][3],int n)&&&& // 其中二维数组形参必须确定数组的第二维的长度,第一维长度可以不定//int fun(int (*a)[3],int n)&& //& 和& int&& fun(int a[][3],int n)& 功能和用法完全相同{&&& int sum=0;&&& for (int i=0;i&n;i++)&& &{&& &&&&& for(int j=0;j&3;j++)&& &&& & sum=sum+a[i][j];&& &}&&&}void fun1(int a[2]){&&& int n = sizeof(a); // 因为在实际函数调用时,传递来的实参都是指针,所有这里是对指针求sizeof,&& &&&&&&&&&&&&&&&&&&& // 而指针变量是int的整型变量。在vc++ 6.0中int类型变量占4字节,所以 n肯定是4&&& printf("%d/n",n);}int fun2(int a[],int n)&& //形参中可以不指定一维数组的大小。{&& &int sum=0;&& &for(int i=0;i&n;i++)&& &&& & sum=sum+a[i];&& &}int main(){&& &int b[2][3] = {{1,2,3},{4,5,6}};&& &int a[3]={1,2,3};&&& int num=0;&& &int num2=0;&& &int i=2;&& &int *p=&i;&&&&&&& num=fun(&b[0],2);&&& //ok&& &//& num =fun(b,2);& //ok&& &//& num=fun(&b[0][0],2);& // error C2664: 'fun' : cannot convert parameter 1 from 'int *' to 'int [][3]'&&& //& num=fun(&b,2);&&&&&&& // error C2664: 'fun' : cannot convert parameter 1 from 'int (*)[2][3]' to 'int [][3]'&&& //& num=fun(b[0],2);&&&&& // error C2664: 'fun' : cannot convert parameter 1 from 'int [3]' to 'int [][3]'& &&&&&&&& num2=fun2(&a[0],3); // ok&& &//&& &num2=fun2(a,3);& //ok&&& //& printf("%d/n",num2);&& &//& printf("%d %d %d %d %d %d/n",b[0],&b[0],b[0][0],&b[0][0],b,&b); //只有b[0][0]是数组元素,其他均为地址&&& //& 结果:
1245032 &&& //& 结论:虽然 b[0],&b[0],&b[0][0],b,&b 的值都相同,但是它们所代表(指向)的类型可能就不一样,其中&b[0]和b所指&&& //& 向的类型是相同的,b[0]和&b[0][0]的类型可以是认为是相当(注意是相当,不是相同)。&& //& C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针,& //& 当N维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素(这里的首元素是个N-1维数组)首地址的指针,&&& //& printf( "%d/n ",num);&& &//&& &printf("%d %d %d/n",sizeof(*p),sizeof(p),sizeof(b));& // sizeof(b)是求数组里所有元素所占的内存总和&&& //& printf("%d %d %d %d/n",*p,p,sizeof(&b[0]),sizeof(b[0])); &&&&&&&&& // sizeof(&b[0])是对指针,即数组b的第一个元素(当然它是个长度是3的一维数组)的地址作用&& &&& && // sizeof(b[0])是对数组b的第一个元素(当然它是个长度是3的一维数组)的作用,相当于求长度是3的一维数组所有&&&&&&&& // 元素所占内存和&&& //& 结果:2
12 //其中1245008是p的值,即*p的地址 && &//&& &fun1(a); //ok&& &//&& &fun1(&a[0]);//ok&& &//&& &fun1(&a);// error C2664: 'fun1' : cannot convert parameter 1 from 'int (*)[3]' to 'int []'&& &&& &&& &//&& &printf("%d/n",sizeof(a));&&&&&&& return&& 0;}//*****************************************************************************//二维数组的引用作形参时,注意事项。看例子#include&iostream&&& int&& fun(int (&a)[2][3])&&&&&&&& //ok,引用作形参,数组作引用形参,必须指定清楚所有维数// int& fun(int (&a)[ ][3],int n)&&&& //error C2265: '&Unknown&' : reference to a zero-sized array is illegal// int& fun(int &a[2][3])&&&&&&&&&&&& // error C2234: '&Unknown&' : arrays of references are illegal{&&& int sum=0;&&& for (int i=0;i&2;i++)&&& {&&&&&&&& for(int j=0;j&3;j++)&&&&&&&& sum=sum+a[i][j];&&& }&&&}int main(){&&& int b[2][3] = {{1,2,3},{4,5,6}};&&& int num=0;&&& num=fun(b);&&& printf("%d/n",num);&&& return 0;}
本文已收录于以下专栏:
相关文章推荐
1.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略
第一维的大小说明,如:
void Func(int array[3][10]);
//////////method first//////////////////
//直接用二维数组的形式
C++中关于二维数组作为函数参数传递的问题
文章转自:/LeeZz/p/5084498.html
在做数据结构迷宫实验的时候,要...
值传递:形参是实参的副本(复制、拷贝),形参值的改变不会影响实参的值,这种方式是很常见的。
指针传递:形参是指针类型,形参作指针运算后指向的就是实参,所以会影响实参的值。这种方式也是很常见的。
问:能否像下边这样用void **指针作为参数,使函数模拟按引用传递参数吗?
void f(void **);
数组作为参数进行传递,不能将数组的所用元素一次全都传进子函数中,
要么我们可以一次传进去数组中一个元素的内容,要么我们可以传一个数
组的指针,传递一维数组的指针这里不讲,只说一下传递二维数组时,二...
#!/usr/bin/python
#coding:utf8
#中文输入方式1
#coding=utf8
#中文输入方式2
#encoding:utf8
#中文输入方式3
*先声明下:
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 函数形参 需要定义吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信