{
int a[10][10]={{1,2,3},{4,5,6},{7,8,9}};
int n;
n=FindSumLeavingOutRowCol(a, 3,3,1,2);
printf("%d",n);
}
int FindSumLeavingOutRowCol(int** arr, int m, int n, int k,int l)
{
int sum,i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if((i==k)&&(j==l))
{
;
}
else{
sum+=*(*(a+i)+j);
}
}
}
我在传递二维数组时遇到错误,也就是说'a'未声明。请帮我整理一下这个bug!
答案 0 :(得分:1)
表达式中的数组(例如,当用作参数时)将转换为指向其第一个元素的指针。
如果您有这样的数组
int a[10][10];
可以像
一样重写int ( a[10] )[10];
它是一个由10个int[10[
类型元素组成的数组,然后在表达式中将它转换为类型int ( * )[10]
,
例如,你可以写
int ( a[10] )[10] = { {1,2,3}, {4,5,6}, {7,8,9} };
int ( *p )[10] = a;
因此该函数应该声明为
int FindSumLeavingOutRowCol( int arr[][10], int m, int n, int k,int l);
与
相同int FindSumLeavingOutRowCol( int ( *arr )[10], int m, int n, int k,int l);
如果编译器支持可变长度数组,并且变量m
和n
表示维度(而不是范围),则该函数也可以声明为
int FindSumLeavingOutRowCol( int m, int n, int arr[m][n], int k,int l);
或
int FindSumLeavingOutRowCol( int m, int n, int arr[][n], int k,int l);
或喜欢
int FindSumLeavingOutRowCol( int m, int n, int ( *arr )[n], int k,int l);
否则,您需要再添加两个参数来指定除尺寸之外的范围。
注意变量sum
未初始化
int sum,i,j;
因此该函数将具有未定义的行为。
此外,参数声明为名称arr
而不是a
。
我希望该函数有一个返回语句,如
return sum;
答案 1 :(得分:0)
让我们从简单的开始:
也表示'a'未申报。
int FindSumLeavingOutRowCol(int** arr, int m, int n, int k,int l)
{
// [...]
sum+=*(*(a+i)+j);
// [...]
}
在此行中,您引用既不存在于文件范围内也不存在于此函数中的a
。你的意思可能是arr
。
但真正的问题是你的第一个问题:
我在传递2 d数组时遇到错误
这是因为你的函数需要一个指向指针的指针,该指针是不指向2d数组的第一个元素的指针。
来自n1570 (latest draft for C11):
§6.7.6.3函数声明符(包括原型),第7页:
参数声明为'' type ''的数组应调整为''限定指针 type '',其中类型限定符(如果有)是在
[
和]
内指定的类型限定符。 数组类型推导。 [...]
因此,由于数组无法传递给函数,因此传递指针,如果将函数参数声明为数组类型,则会自动调整指针类型。
这对于1d数组来说很简单。说你有
int x[5];
和一个功能
void foo(int a[]);
然后这个函数声明等同于
void foo(int *a);
你可以像
一样传递你的数组foo(x);
因为数组的标识符也计算为指向第一个数组元素的指针 - &gt;输入int *
。
使用2d数组时,适用相同的规则。你可以用这样的参数编写你的函数:
int foo(int arr[][10]);
将其调整为指针类型将导致
int foo(int (*arr)[10]);
这是指向int
的10个元素数组的指针。它是不 <指向的指针。 int a[10][10]
的10个元素都是10个整数的数组。