c语言二维数组函数引用,c语言调用二维数组函数
C语言二维数组的函数调用
函数调用不能这么用,第36行。C标准里面返回值是不能直接返回一个数组的,只能返回数组的首地址。输出学生成绩和每科成绩那个函数,你可以定义一个全局变量数组,还有求平均值最好用float 或者double,用int会造成精度流失。帮你调试了一下,大概就这样吧
创新互联公司专业为企业提供广宗网站建设、广宗做网站、广宗网站设计、广宗网站制作等企业网站建设、网页设计与制作、广宗企业网站模板建站服务,十余年广宗做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
C语言二维数组指针 函数引用
通俗的说如果把二维数组看做一个表格的话,前面[3]代表行,而[5]代表列,
而一个数组的代表的最基本含义就是一个行,
那么数组指针的的话,必然是指向数组即指向行,那么说回这个题目,
int *[5]代表,该指针指向的是一个列为5个元素组成的数组,那么int a[3][5]代表的是有3行的每行有5个元素组成的数组,该指针指向的数组的存储大小与这个2维数组的单行存储大小匹配,自然可以指向其中的某一行
而int*[3]只有3个元素无法与5个元素相匹配,自然不能指向其中的一行
如何通过函数调用二维数组
C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。最近在编程的过程中就碰到了这个问题:有如下的测试程序:
voidtest(double **x,int Row,int Col);
voidtest(double **x)
{
for(int i=0;iRow;i++)
for(int k=0;kCol;k++)
x[i][k] += 100.0;
}
intmain(int argc, char *argv[])
{
/*
double **x;
x = new double *[3];
for(int i=0;i3;i++)
x[i] = new double[3];
*/
double x[3][3];
for(int i=0;i3;i++)
for(int k=0;k3;k++)
x[i][k] = i*k;
test(x,3,3);
for(int i=0;i3;i++)
for(int k=0;k3;k++)
printf("x[%d][%d]= %e\n",i,k,x[i][k]);
getch();
return 0;
}
编译时提示Cannot convert 'double [*][3]' to double **'。
将调用方式强制进行类型转换:test((double **)x),编译通过,运行出错,提示非法越界。
据传:因为栈上分配的数组和堆上分配的数组在内存排列上可能不相同,直接定义的数组是存储在程序的堆栈区,数据占用连续的区间;而动态申请的数组是在系统的远堆上(far heap),除最后一维的元素是连续存放的外,其他维上的元素有可能不是在一块连续的内存区域里。
//栈上:
int ia[2][2] = {2,3,4,5}; //4个元素是连续排列的内存段
//堆上:
int **p = new int*[2]; //只有每行内是连续排列,各行并不一定连续排列
for ( int i = 0; i 2; i++ )
{
p[i] = new int[2];
}
for ( int i = 0; i 2; i++ )
{
for ( int j = 0; j 2; j++ )
{
p[i][j] = ia[i][j];
}
}
所以对栈上的数组用int **p指向首地址,因为int **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。
如果找一个通用方程只能用:
void f( int *p, int row, int col ) //给出数组的行和列,对堆上的数组不合适
{
for ( int i = 0; i row; i++)
{
for ( int j = 0; j col; j++ )
{
cout p[i * row + j] " ";
}
cout endl;
}
}
int main(){
//.........
int ia[2][2] = {2,3,4,5};
f( (int*)ia, 2, 2 );
}
采用上面的通用办法还是比较麻烦,这无形中对编程增加了难度,为了避免这个麻烦可以采用动态数组的形式,将原来采用直接定义的数组全部换成动态数组,类似开头例子中被注释掉的那部分代码,当然这样也有后续的麻烦,动态数组的生命周期完成后必须释放内存空间,这也有点罗嗦,但是毕竟可以直接使用数组的形式,比上面的通用方式还是要简单一点。
如果执意要使用直接定义的数组该怎么办呢?有如下几种方法:
方法一:
voidtest(double (*x)[3], int Row, int Col);
调用方式:test(x,Row,Col);
调用用方式 test(x,Row,Col);
方法二:
voidtest(double x[][3], int Row,int Col);
调用方式 test(x,Row,Col);
对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。
从上面的对直接定义的数组的引用情况看,直接定义的数组的使用比较麻烦,一旦直接定义数组的维数发生变换,函数的定义必须相应的修改,否则程序就会出错,这也增加了程序进一步开发的麻烦,为了一劳永逸的解决这个问题,建议还是使用动态数组的方法,虽然需要手工释放内存,但是除却了后续的麻烦。
c语言二维数组怎么用函数一个一个调用,这样对吗
对的,是我的第二种方法。
1.可以用指针。
void
Func(int
**array,
int
m,
int
n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
*((int*)array
+
n*i
+
j);
2.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:
void
Func(int
array[3][10]);
void
Func(int
array[][10]);
二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
void
Func(int
array[][]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多
少列,不能只指定一维而不指定第二维,下面写法是错误的:
void
Func(int
array[3][]);
实参数组维数可以大于形参数组,例如实参数组定义为:
void
Func(int
array[3][10]);
而形参数组定义为:
int
array[5][10];
这时形参数组只取实参数组的一部分,其余部分不起作用。
c语言中如何引用二维数组
数组的4种声明方式:
1.先声明再初始化
例如:
//1.声明
int[] nums;
//初始化
nums = new int[5];
2.声明并初始化
例如:
//2.声明、初始化
int[] nums = new int[10];
3.创建数组同时赋值
例如:
//3.创建数组同时赋值
String[] names=new String[]{"大名","小米","夏雨荷"};
int[] ages=new int[]{21,22,21,56,13};
for (int i = 0;i names.length;i++){
System.out.prinrln(names[i]);
}
for (int i = 0;i ages.length;i++){
System.out.prinrln(ages[i]);
}
4.创建同时赋值,简写,不能写成两条语句
例如:
//4.创建同时赋值,简写,不能写成两条语句
String[] cities = {"上海","北京"};
扩展资料:
数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
C语言中如何将二维字符数组作为函数参数引用传递
不可能达到目的。因为C语言中没有引用这类型,C++才有。另,C/C++都不支持传递数组,只能传递数组的首元素或行指针,所以即使是C++,也只能传递数组指针的引用,而不可能传递数组的引用,因为数组没有引用。
当前文章:c语言二维数组函数引用,c语言调用二维数组函数
路径分享:http://cdiso.cn/article/hcsjgo.html