二维数组作为函数参数,实参可以直接使用二维数组名,在被调用函数中对形参数组定义可以指定所有维数的大小,也可以省略第一维的大小说明,如:
它们是合法且等价,也可以使用如下形式:
但不能省略第二维的大小,如下面的定义是不合法的,编译时会出错:
因为从实参传递来的是数组的起始地址,如果在形参中不说明列数,编译器将无法定位元素的的位置。
#include <stdioh>
#include <stdlibh>
#include <stringh>
void fun(int x[][3])
{
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", x[i][j]);
}
printf("\n");
}
}
int main()
{
int a[2][3] = {1, 2, 3, 4, 5, 6};
fun(a);
return 0;
}
定义形参的时候定义列的数目即可,其实就算你随便定义行和列的大小也可以运行,只要将数组地址传进去即可
#include <stdioh>
#include <stdlibh> // for malloc()
// 返回一个hilbert类型的(n n)阶矩阵
double hilbert(int n) {
int i,j;
double arr = (double )malloc(n sizeof(double ));
for(i = 0; i < n; i++) {
arr[i] = (double )malloc(n sizeof(double));
for(j = 0; j < n;j++) {
arr[i][j] = 10/(i + j + 1);
}
}
return arr;
}
// 显示二维数组信息
void show(double a,int n) {
int i,j;
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j)
printf("%4lf ",a[i][j]);
printf("\n");
}
printf("\n");
}
// 释放动态内存
void freememory(double a,int n) {
int i;
for(i = 0; i < n; ++i)
free(a[i]);
free(a);
}
int main () {
double a;
a = hilbert(8);
show(a,8);
freememory(a,8);// 内存释放动态,避免内存泄漏
a = hilbert(5);
show(a,5);
freememory(a,5);// 内存释放动态,避免内存泄漏
return 0;
}
属于地址传递,在函数里修改的话,将直接影响调用方的数值。这是因为数组名代表这个数组的首地址,不过是静态不可更改的而已。在函数里用引用[i]下标时,就是找到这个数组第i号元素的地址进行修改的。所以是第于是地址传递。
void fun(int s)
{
s[0][0]=;
s[0][1]=;
}
main()
{
int a[5][5];
fun(a);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)