二维数组和指针。

时间:2017-11-06 10:27:46

标签: c arrays multidimensional-array

{
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!

2 个答案:

答案 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);

如果编译器支持可变长度数组,并且变量mn表示维度(而不是范围),则该函数也可以声明为

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个整数的数组。