在C语言中,表达式必须具有指向对象类型的指针。

5
我正在尝试在函数和数组中使用指针,但当我在主函数中调用报告函数时,我一直收到错误消息“表达式必须具有对象类型的指针”。我已经尝试了所有方法,但似乎没有起作用。请问我做错了什么吗?
请注意:如果没有“report”函数,如果我在“main”中分别调用其他函数,则可以正常工作。只有在“report”函数中才会出现问题。
#include <stdio.h>
#include <conio.h>

void print(int *list, int row_count, int column_count);
void rowaverage(int *list, int row_count, int column_count);
void allaverage(int *list, int row_count, int column_count);
void largest(int *list, int row_count, int column_count);
void report(int *list, int row_count, int column_count);

int main()
{
  int i = 1, row, column;
  int list[3][5];
  printf("Enter 3 sets of 5 integers::\n");
  for (row = 0; row < 3; row++)
  {
    printf("Elements in the %d set are ::\n", row);
    for (column = 0; column < 5; column++)
    {
      printf("Element No. %d is ", i++);
      scanf("%d", &list[row][column]);
    }
    printf("\n");
    i = 1;
  }
  printf("The elements in array are:\n");

  report(&list[0][0], row, column);

  getch();
  return 0;
}

void print(int *list, int row_count, int column_count)
{
  int column, row;
  for (row = 0; row < row_count; row++)
  {
    for (column = 0; column < column_count; column++)
    {
      printf("%8d", *(list + row * column_count + column));
    }
    printf("\n");
  }
}

void rowaverage(int *list, int row_count, int column_count)
{
  int column, row;
  for (row = 0; row < row_count; row++)
  {
    float sum = 0, count = 0;
    for (column = 0; column < column_count; column++)
    {
      sum += *(list + row * column_count + column);
      count++;
    }
    printf("Average of row %d is %.2f\n", row, (sum / count));
  }
}

void allaverage(int *list, int row_count, int column_count)
{
  int column, row;
  float sum = 0, count = 0;
  for (row = 0; row < row_count; row++)
  {
    for (column = 0; column < column_count; column++)
    {
      sum += *(list + row * column_count + column);
      count++;
    }
  }
  printf("Average of all elements in array is %.2f\n", (sum / count));
}

void largest(int *list, int row_count, int column_count)
{
  int column = 0, row = 0;
  int largest = *(list + row * column_count + column);
  for (row = 0; row < row_count; row++)
  {
    for (column = 0; column < column_count; column++)
    {
      if (largest < *(list + row * column_count + column))
      {
        largest = *(list + row * column_count + column);
      }
    }
  }
  printf("The largest number in the array is %d\n", largest);
}

void report(int *list, int row_count, int column_count)
{
  int row = 0, column = 0;
  print(list[0][0], row, column);
  printf("\n");
  rowaverage(list[0][0], row, column);
  printf("\n");
  allaverage(list[0][0], row, column);
  printf("\n");
  largest(list[0][0], row, column);
}

1
你尝试过调试你的应用程序以缩小错误出现的位置吗? - Spook
是的,在报告功能中出现了错误。 - anansharm
1
<conio.h> - 你在使用MS-DOS吗? - Roland Illig
1
@Spook 他遇到了编译错误。 - n. m.
1
@anansharm 你能否与我们分享错误信息? - Spook
4个回答

9
在报告功能中删除该行,并查看以下报告功能:
int row = 0, column = 0;

在函数中,使用列表作为
int list[][5]

将其称为呼叫列表

list

不同于

list[0][0]

这是完整的代码:

#include <stdio.h>
#include <stdlib.h>

void print(int list[][5], int row_count, int column_count)
{
    int column, row;

    for (row = 0; row < row_count; row++) {
        for (column = 0; column < column_count; column++)
            printf("%8d", list[row][column]);
        printf("\n");
    }
}

void rowaverage(int list[][5], int row_count, int column_count)
{
    int column, row;

    for (row = 0; row < row_count; row++) {
        float sum = 0, count = 0;
        for (column = 0; column < column_count; column++) {
            sum += list[row][column];
            count++;
        }
        printf("Average of row %d is %.2f\n", row, (sum / count));
    }
}

void allaverage(int list[][5], int row_count, int column_count)
{
    int column, row;
    float sum = 0, count = 0;

    for (row = 0; row < row_count; row++) {
        for (column = 0; column < column_count; column++) {
            sum += list[row][column];
            count++;
        }
    }

    printf("Average of all elements in array is %.2f\n", (sum / count));
}

void largest(int list[][5], int row_count, int column_count)
{
    int column = 0, row = 0;
    int largest = list[0][0];

    for (row = 0; row < row_count; row++) {
        for (column = 0; column < column_count; column++) {
            if (largest < list[row][column]) {
                largest = list[row][column];
            }
        }
    }

    printf("The largest number in the array is %d\n", largest);
}

void report(int list[][5], int row_count, int column_count)
{
    print(list, row_count, column_count);
    printf("\n");
    rowaverage(list, row_count, column_count);
    printf("\n");
    allaverage(list, row_count, column_count);
    printf("\n");
    largest(list, row_count, column_count);
}


int main()
{
    int i = 1, row, column;
    int list[3][5];

    printf("Enter 3 sets of 5 integers::\n");

    for (row = 0; row < 3; row++) {
        printf("Elements in the %d set are ::\n", row);
        for (column = 0; column < 5; column++) {
            printf("Element No. %d is ", i++);
            scanf("%d", &list[row][column]);
        }
        printf("\n");
        i = 1;
    }

    printf("The elements in array are:\n");

    report(list, row, column);

    return 0;
}

我该如何使用指针和数组来解决这个问题?实际上,我想用函数指针和数组来解决它。 - anansharm
你正在使用静态数组。因此,你必须在函数中提供数组的宽度。对于动态分配的数组,你可以在函数中使用指针(如int **list)。 - taneryilmaz
1
您也可以关注以下链接:
  • http://c-faq.com/aryptr/pass2dary.html
  • https://dev59.com/9moy5IYBdhLWcg3wHaXt
- taneryilmaz

0

所以您正在 report 函数中传递一个 int 指针:

int list[3][5];
report(&list[0][0], row, column);
...
void report(int *list, int row_count, int column_count)
...

但是你在报告函数中使用列表作为指向整数指针的指针:

list[0][0]

但它并不是一个指向指向整型的指针。它只是一个int*类型的变量而已。所以在report函数中,"list"被解引用了两次。这是错误的。
如果你在report()函数的调用中只使用"list"作为参数,而不是"[0][0]",你可以修复这个问题。
rowaverage(list, row, column);

@RolandIllig 把矩阵的第一个元素的指针传递给 report()。然后在原始代码中对它进行了两次解引用,导致程序崩溃。但是如果只解引用一次,它将成为矩阵的第一个元素。为什么这样做不起作用呢? - Michael
@RolandIllig 我明白你在说什么。已修复。 - Michael

0

你在处理数组的时候完全错了。

暂时忘掉 &*。在这个程序中你不需要它们。

你的 list 是一个 int[3][5],不是一个 int* 或其他任何类型。在所有函数中都要声明它。

void rowaverage(int list[3][5], ...

等等。在函数中像这样访问它:

list[row][column]

不是 list+row*column_count+column

将列表传递给函数,如下所示:

rowaverage(list, ...

不是 rowaverage(&list[0][0], ....,

我不知道你为什么把report和其他所有函数写得不一样,但这并不重要,因为所有其他函数都是完全错误的。如果它们能够工作,那只是纯属运气。

拿起一本好的C语言书籍并阅读它。


我想在函数和二维数组中使用指针,我想知道如何使用指针和数组来解决它。 - anansharm
写一些异常复杂和/或次优代码作为练习是可以的,但你应该事先警告我们,以免浪费时间试图纠正它。 - n. m.

0
也许你可以将参数 list[0][0] 改为 list。因为list是一个指向int的指针,而list[0][0]只是一个int。它们的类型不同,你的函数需要一个指针作为第一个参数。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接