Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 通过引用将2D数组传递给函数_Arrays_C_Pointers_Matrix - Fatal编程技术网

Arrays 通过引用将2D数组传递给函数

Arrays 通过引用将2D数组传递给函数,arrays,c,pointers,matrix,Arrays,C,Pointers,Matrix,我试图在C中使用2D数组添加两个矩阵。这里我将数组名作为参数传递,我认为这是通过引用传递的。但是,我无法添加数组。add函数有些可疑,我无法添加数组 我甚至尝试使用操作符的地址传递参数,但是数组本身就是指针,所以它出错了。我尝试使用数组的名称传递。我卡住了 #include<stdio.h> void input(int*,int*); void add(int*,int*,int*); void display(int*); int main() { int a[3][3],b[

我试图在C中使用2D数组添加两个矩阵。这里我将数组名作为参数传递,我认为这是通过引用传递的。但是,我无法添加数组。
add
函数有些可疑,我无法添加数组

我甚至尝试使用操作符的地址传递参数,但是数组本身就是指针,所以它出错了。我尝试使用数组的名称传递。我卡住了

#include<stdio.h>
void input(int*,int*);
void add(int*,int*,int*);
void display(int*);

int main()
{
int a[3][3],b[3][3],sum[3][3];
 input(a,b);
 add(a,b,sum);
 display(sum);
 return 0;
 }

void input(int*a,int*b)
{
    for(int i = 0;i<3;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("Enter the element at a[%d][%d]",i+1,j+1);
            scanf("%d",((a+i)+j));
        }
    }
    for(int i = 0;i<3;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("Enter the element at b[%d][%d]",i+1,j+1);
            scanf("%d",((b+i)+j));
        }
    }
}
    void add(int* a,int*b,int*sum)
    {
        for(int i =0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                *(sum[i]+j) = *(a[i]+j) + *(b[i]+j);//error at this line
            }
        }
    }
 
 void display(int* sum)
  {
      printf("The sum is:\n");
      for(int i =0;i<3;i++)
      {
          for(int j =0;j<3;j++)
          {
            printf("%d ",(sum[i]+j));
          }
           printf("\n");
      }
  }

但是,我的操作数很容易成为指针。

问题在于方法:

void input(int*, int*);
void add(int*, int*, int*);
void display(int*);
需要一个指针,但是您正在向它们传递2D数组(静态分配),即
inta[3][3]、b[3][3]、sum[3][3]。因此,正如评论中已经指出的,这些2D数组将转换为
'int(*)[3]'
。因此,您需要调整方法的签名以:

void input(int [][3], int [][3]);
void add(int [][3], int [][3], int [][3]);
void display(int [][3]);

或者,如果希望将int*保留为参数,那么可以将矩阵分配为单个数组,并相应地调整代码

这里我将数组名作为参数传递,我认为这是pass 但是我不能添加数组。数组中有些可疑 add函数,我无法添加数组

您可以使用
int*
int[][]
,但您需要根据每种情况编写程序。我将向您展示这两种情况的示例

关于你的节目
  • 不要使用
    void
    。这通常是一种浪费,有时是一种错误。归还一些东西
  • 一般地写。比较:
始终测试scanf()的返回。scanf()不是用来从键盘读取的。在每个提示中至少使用一个空格。它对用户来说更为舒适

  • 使用常量测试程序。避免为用户阅读,因为这将在测试上浪费大量时间
一个例子 输出 代码 我相信,这段代码使用了我试图解释的所有内容。注意使用指针时编写代码的方式:只使用地址和位移,不需要括号

#include<stdio.h>

void    add_a(int[][3],int[][3],int[][3],int);
void    display_a(int[][3],int,const char*);
int     input_a(int[][3], int, const char*);

void    add_p(int*,int*,int*,int);
void    display_p(int*,int,const char*);
int     input_p(int*, int, const char*);

int main(void)
{
    int t1[][3] =
    {
        { 1,2,3 },
        { 4,5,6 },
        { 7,8,9 }
    };

    int t2[][3] =
    {
        { 9,8,7 },
        { 6,5,4 },
        { 3,2,1 }
    };
    
    int a[3][3];
    int b[3][3];
    int sum[3][3];

    printf("Using arrays\n\n");

    input_a(a,2,"Matriz A");
    input_a(b,2,"Matriz B");
    display_a(a, 2, "The 1st matrix:");
    display_a(b, 2, "The 2nd matrix:");

    add_a( a,b,sum, 2 );
    display_a(sum, 2, "The sum (using arrays) is:");

    printf("Using pointers\n\n");

    input_p((int*) a,2,"Matriz A");
    input_p((int*) b,2,"Matriz B");
    display_p( (int*) a, 2, "The 1st matrix:");
    display_p( (int*) b, 2, "The 2nd matrix:");

    add_p(  (int*) a, (int*) b, (int*) sum, 2 );
    display_p( (int*) sum, 2, "The sum (using pointers) is:");


    printf("\nUsing t1 t2 \n\n");

    display_p( (int*) t1, 3, "The t1 matrix:");
    display_p( (int*) t2, 3, "The t2 matrix:");

    add_p(  (int*) t1, (int*) t2, (int*) sum, 3 );
    display_p( (int*) sum, 3, "t1 + t2 (using pointers) is:");

    return 0;
};

void add_a(
    int a[][3],
    int b[][3],
    int sum[][3],
    int l // lines
    )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            sum[i][j] = a[i][j] + b[i][j];
    return;
};
 
void display_a(int s[][3], int l, const char* msg)
{
    if( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
        printf("%d ", s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return;
};

 int input_a(int a[][3], int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d",&a[i][j]);
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};

void add_p( int*a, int* b, int* sum, int l  )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            *(sum + i*l + j) =  *(a + i*l + j) + *(b + i*l + j);
    return;
};
 
void display_p(int* s, int l, const char* msg)
{
    if( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
            printf("%d ", *( s + i*l + j) );
        printf("\n");
    };
    printf("\n");
    return;
};

 int input_p(int* a, int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d", (a + i*l + j) );
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};
#包括
无效添加a(int[][3],int[][3],int[][3],int);
无效显示(int[][3],int,const char*);
int输入_a(int[][3],int,const char*);
无效添加p(int*,int*,int*,int);
无效显示(int*,int,const char*);
int-input_p(int*,int,const-char*);
内部主(空)
{
int t1[][3]=
{
{ 1,2,3 },
{ 4,5,6 },
{ 7,8,9 }
};
int t2[][3]=
{
{ 9,8,7 },
{ 6,5,4 },
{ 3,2,1 }
};
INTA[3][3];
int b[3][3];
整数和[3][3];
printf(“使用数组\n\n”);
输入_a(a,2,“矩阵a”);
输入_a(b,2,“矩阵b”);
显示a(a,2,“第一矩阵:”);
显示a(b,2,“第二矩阵:”);
加上a(a,b,sum,2);
显示_a(总和,2),“总和(使用数组)为:”;
printf(“使用指针\n\n”);
输入p((int*)a,2,“矩阵a”);
输入p((int*)b,2,“矩阵b”);
显示p((int*)a,2,“第一个矩阵:”);
显示p((int*)b,2,“第二个矩阵:”);
加上p((int*)a,(int*)b,(int*)和,2);
显示p((int*)和,2,“和(使用指针)是:”;
printf(“\n使用t1 t2\n\n”);
显示p((int*)t1,3,“t1矩阵:”);
显示p((int*)t2,3,“t2矩阵:”);
加上p((int*)t1,(int*)t2,(int*)和,3);
显示p((int*)和,3,“t1+t2(使用指针)是:”;
返回0;
};
无效添加(
int a[][3],
int b[][3],
整数和[][3],
int l//行
)
{

对于(int i=0;iMine给出以下错误“注意:应为'int',但参数的类型为'int()[3]””
void input(int a[][3], int b[][3]){
      // the code
}

void add(int a [][3], int b [][3], int sum [][3]){
      // the code
}

void display(int sum [][3]){
      // the code
}    
 void display(int* sum)
  {
      printf("The sum is:\n");
      for(int i =0;i<3;i++)
      {
          for(int j =0;j<3;j++)
          {
            printf("%d ",(sum[i]+j));
          }
           printf("\n");
      }

  }
void display_a(int s[][3], int l, const char* msg)
{
    if( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
        printf("%d ", s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return;
};
printf("Enter the element at a[%d][%d]",i+1,j+1);
 scanf("%d",((a+i)+j));
Using arrays

Matriz A at [1][1] 1
Matriz A at [1][2] 2
Matriz A at [1][3] 3
Matriz A at [2][1] 4
Matriz A at [2][2] 5
Matriz A at [2][3] 6
Matriz B at [1][1] 6
Matriz B at [1][2] 5
Matriz B at [1][3] 4
Matriz B at [2][1] 3
Matriz B at [2][2] 2
Matriz B at [2][3] 1
The 1st matrix:
1 2 3
4 5 6

The 2nd matrix:
6 5 4
3 2 1

The sum (using arrays) is:
7 7 7
7 7 7

Using pointers

Matriz A at [1][1] 2
Matriz A at [1][2] 3
Matriz A at [1][3] 4
Matriz A at [2][1] 5
Matriz A at [2][2] 6
Matriz A at [2][3] 7
Matriz B at [1][1] 7
Matriz B at [1][2] 6
Matriz B at [1][3] 5
Matriz B at [2][1] 4
Matriz B at [2][2] 3
Matriz B at [2][3] 2
The 1st matrix:
2 3 5
5 6 7

The 2nd matrix:
7 6 4
4 3 2

The sum (using pointers) is:
9 9 9
9 9 9


Using t1 t2

The t1 matrix:
1 2 3
4 5 6
7 8 9

The t2 matrix:
9 8 7
6 5 4
3 2 1

t1 + t2 (using pointers) is:
10 10 10
10 10 10
10 10 10
#include<stdio.h>

void    add_a(int[][3],int[][3],int[][3],int);
void    display_a(int[][3],int,const char*);
int     input_a(int[][3], int, const char*);

void    add_p(int*,int*,int*,int);
void    display_p(int*,int,const char*);
int     input_p(int*, int, const char*);

int main(void)
{
    int t1[][3] =
    {
        { 1,2,3 },
        { 4,5,6 },
        { 7,8,9 }
    };

    int t2[][3] =
    {
        { 9,8,7 },
        { 6,5,4 },
        { 3,2,1 }
    };
    
    int a[3][3];
    int b[3][3];
    int sum[3][3];

    printf("Using arrays\n\n");

    input_a(a,2,"Matriz A");
    input_a(b,2,"Matriz B");
    display_a(a, 2, "The 1st matrix:");
    display_a(b, 2, "The 2nd matrix:");

    add_a( a,b,sum, 2 );
    display_a(sum, 2, "The sum (using arrays) is:");

    printf("Using pointers\n\n");

    input_p((int*) a,2,"Matriz A");
    input_p((int*) b,2,"Matriz B");
    display_p( (int*) a, 2, "The 1st matrix:");
    display_p( (int*) b, 2, "The 2nd matrix:");

    add_p(  (int*) a, (int*) b, (int*) sum, 2 );
    display_p( (int*) sum, 2, "The sum (using pointers) is:");


    printf("\nUsing t1 t2 \n\n");

    display_p( (int*) t1, 3, "The t1 matrix:");
    display_p( (int*) t2, 3, "The t2 matrix:");

    add_p(  (int*) t1, (int*) t2, (int*) sum, 3 );
    display_p( (int*) sum, 3, "t1 + t2 (using pointers) is:");

    return 0;
};

void add_a(
    int a[][3],
    int b[][3],
    int sum[][3],
    int l // lines
    )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            sum[i][j] = a[i][j] + b[i][j];
    return;
};
 
void display_a(int s[][3], int l, const char* msg)
{
    if( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
        printf("%d ", s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    return;
};

 int input_a(int a[][3], int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d",&a[i][j]);
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};

void add_p( int*a, int* b, int* sum, int l  )
{
    for(int i =0;i<l;i++)
        for(int j=0;j<3;j++)
            *(sum + i*l + j) =  *(a + i*l + j) + *(b + i*l + j);
    return;
};
 
void display_p(int* s, int l, const char* msg)
{
    if( *msg != 0) printf("%s\n",msg);
    for(int i =0;i<l;i++)
    {
        for(int j =0;j<3;j++)
            printf("%d ", *( s + i*l + j) );
        printf("\n");
    };
    printf("\n");
    return;
};

 int input_p(int* a, int l, const char* msg )
{
    for(int i = 0;i<l;i++)
    {
        for(int j =0;j<3;j++)
        {
            printf("%s at [%d][%d] ", msg, i+1,j+1);
            int res = scanf("%d", (a + i*l + j) );
            if ( res != 1 ) return -1; // read nothing
        }
    };
    return 0;
};