c语言数组问题

时间:2011-05-02 07:41:31

标签: c arrays pointers

您好 我是c语言的新手我有一个问题: 我想通过指针向函数发送二维数组。 该函数应返回指向二维数组的指针。 我为此编写了以下代码:

#include<stdio.h>
int* put(int *b);
int main()
{
  int a[2][3],i,j;
  system("clear");  
  put(a);

  for(i=0;i<2;i++)
    { 
      for(j=0;j<3;j++)
        {    
          printf("\na[%d][%d]= %d",i,j,a[i][j]);
        }
    }

  return 0;
}

int* put(int *b)
{
  for(i=0;i<2;i++)
  {
    for(j=0;j<3;j++)
      {
        b[i][j]=i;
      }
  }
  return b;
}

当我使用gcc2de.c编译它时,它显示以下错误:

2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int *’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:28: error: subscripted value is neither array nor pointer
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input

我只是更改以下功能代码:

#include<stdio.h>

int* put(int **b);

int main()
{
  int a[2][3],i,j;
  system("clear");  
  put(a);

  for(i=0;i<2;i++)
    { 
      for(j=0;j<3;j++)
        {    
          printf("\na[%d][%d]= %d",i,j,a[i][j]);
        }
    }

  return 0;
}

int* put(int **b)
{
  for(i=0;i<2;i++)
    {
      for(j=0;j<3;j++)
        {
          b[i][j]=i;
        }
    }
  return b;
}

当我对它进行编译时,我遇到了以下错误:

2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int **’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:31: warning: return from incompatible pointer type
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input
2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int **’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:31: warning: return from incompatible pointer type
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input

我做错了什么? 任何人都可以告诉我通过指针传递2d数组的方法是什么? 任何人都可以告诉我如何通过函数

中的指针返回两个d数组

5 个答案:

答案 0 :(得分:0)

您在哪里存储put的返回值?

根据你的代码,声明应该是int** put( int **)

答案 1 :(得分:0)

您遇到的第一个错误是您正在尝试在另一个函数中定义一个函数。最简单的方法是在您声明它的地方定义put

int put()
{
    /* definition of put */
}

int main()
{
    /* body calls put */
}

第二个问题是,在两个代码段中都没有将兼容参数传递给put

如果你想将a传递给一个函数,那么你应该注意到数组作为参数总是衰减到指向它们第一个元素的指针。

a的类型为int [2][3],即包含3个int s的2个数组的数组。这将衰减为指向3 int s或int (*)[3]的数组的指针。这应该解释您正在获得的编译错误。您应该将put声明为:

void put(int (*b)[3]);

或完全等同于:

void put(int b[][3]);

因为你不能按值传递数组,所以编译器会自动转换一个函数声明,它将一个数组参数转换为一个取等效指针参数的参数。

我已经将返回类型更改为void,因为您不使用或需要返回值,因为您通过指针传递参数。您应该从return b;的定义中删除put

提示:不要将int[2][3]视为二维数组,而应视为数组数组。

答案 2 :(得分:0)

你不能从C中的函数返回一个二维数组,你只能返回指向二维数组的第一个元素的一个指针数组。

也许你会发现有用的东西:

Pass 2d array to function in C?

或者这个:

C++ Returning multidimension array from function

答案 3 :(得分:0)

您遇到的第一个错误是您没有传递函数声明的正确类型。因此,为了使用最少量的更正来清理代码,它可能看起来像这样:

#include<stdio.h>

void put(int *b);

int main()
{
  int a[2][3],i,j;

    put(&a[0][0]);

  for(i=0;i<2;i++)
  { 
    for(j=0;j<3;j++)
    {    
      printf("\na[%d][%d]= %d", i, j, a[i][j]);
    }
  }

  printf("\n\n");

  system("PAUSE");  // Not recommended, but works for now
return 0;
}

void put(int *b)
{
  int count = 1;
  int i, j;

  for(i=0;i<2;i++)
  {
    for(j=0;j<3;j++)
    {
      //b[i][j]=i;
      *(b + ((i*3) + j)) = count++;
    }
  }

}

两个主要更正是:

  1. 通过将其称为&amp; a [0] [0],明确传入二维数组的起始地址。
  2. 另外,请注意在使用int * b时必须使用的指针算法。
  3. 另请注意,由于您传入指针,因此您正在修改该地址位置的值。因此,根本不需要返回指针。

    希望它有所帮助。干杯!

答案 4 :(得分:0)

1.您应该在使用之前声明或定义该功能,它与其他流行的语言不同。

2.您不需要在put函数中返回指针,数组中的数据已被更改

3.你需要注意类型,int array [] []的类型是int **