1

所以我试图做一个旨在在 int 2D 数组中找到 5 个最大元素的问题。我对动态分配数组并将元素输入其中没有任何问题。

printf("Your 2-d order of choice?\n");
    scanf ("%d %d", &i ,&j);
    int array[i][j];
    //Taking 2d array input
    for (int c = 0; c < i; c++)
    {
        for (int d = 0; d < j; d++) 
        {
            scanf("%d", &array[c][d]);
        }
    }

然而,要找到最大 5 个元素并将它们存储在一个数组中,它要求一个带有原型的函数。

int * max5(int **, int ,int)

我不知道如何使用双指针来遍历 2D 数组,即使我阅读了其他一些关于int**、以及int*(返回类型)究竟是什么以及如何合并它的帖子。

4

3 回答 3

1

有很多方法可以将数组作为指针传递

正如你所说,如果你像int array[10][10];.

使用单指针,您可以这样做

int *arr = max5 ((int *)array, 10, 10);

并将数组遍历为

int * max5 (int *arr, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));

    //.........
}

或者使用双指针你也可以这样做

 int *arr =  max5 ((int **)array, 10, 10);

像这样遍历

int * max5 (int **arr, int m, int n)// Same as int * max5 (int *arr[], int m, int n)
{

    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));

    //.........
}

现在其他方式也可能仅供您参考

从 C99 开始,C 语言支持通过简单地指定可变维度来传递可变大小的数组。

int *arr =  max5 (array, 10, 10);

像这样遍历

int * max5 (int arr[][10],int m,int n) //Same as int * max5 ( int (*arr)[10], int m,int n))
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", arr[i][j]);

     //.........
}
于 2014-06-14T08:43:49.740 回答
0

这是max5函数。

它在res中获取 5 个元素(由 malloc 分配),然后对于a的剩余元素,它找到res的最小元素并将其与该元素进行比较- 如果res元素比a元素更小,则res元素是替换为一个

请注意,我通常不会在函数中使用幻数 (5),但因为它被称为max5 ..

#include <limits.h>

int *max5(int **a, int rows, int cols) {
    int *res = malloc(5 * sizeof(int));
    int i,j,k,n=0; // n, number of elements in res

    for (i=0 ; i<rows ; i++) {
       for (j=0 ; j<cols ; j++) {
          if (n < 5) res[n++] = a[i][j];
          else {
             // find lowest res element
             int lowest=0;
             for(k=1 ; k<5 ; k++) { // start from 1!
                if (res[k] < res[lowest]) {
                    lowest = k;
                }
             }
             // if lowest res is < a[i][j], replace it
             if (res[lowest] < a[i][j]) res[lowest] = a[i][j];
          }
       }
    }
    return res;
}

为了演示,这没有优化(一直在寻找最小值)。一种方法是在插入 5 个元素后对res数组进行排序,并在其中一个元素被替换后(从统计上讲,这在迭代中应该越来越少发生)。另一种方法是在最初输入元素时构建一棵树。

正如@hacks 所提到的,数组将被声明为 a int **,然后必须分配iint *行(即i指向int的指针),然后将每一行分配j int的大小。

于 2014-06-14T08:44:30.660 回答
0

对于给定的原型,您必须声明arrayint **并为其动态分配内存。

int **array = malloc(i*sizeof(int*)); 
for(int row = 0; row < i; row++)
    array[row] = malloc(j*sizeof(int));

现在您可以将您的max5函数称为

int *a = max5(array, i, j);

然后在里面动态分配一个数组max5并从max5.

于 2014-06-14T08:30:02.553 回答