【问题标题】:Pointer to 2D array with function指向带有函数的二维数组的指针
【发布时间】:2017-01-14 13:17:32
【问题描述】:

我在理解指针如何与二维数组一起工作时遇到了一些麻烦。即使是错误消息也没有帮助我。我有一个二维数组,我需要一个指针,所以我可以在函数内部对其进行操作(我认为这就是你应该这样做的方式)。有人可以指出我做错了什么并指出正确的方向吗?

这是我的代码:

#include <stdio.h>
#include <time.h>

void init(char *array);

int main(int argc, char *argv[]) {
  char grid[21][80];
  char (*grid_ptr)[80];
  grid_ptr = grid;
  int i, j;
  init(*grid_ptr);

  for (i=0; i<21; i++) {
    for (j=0; j<80; j++) {
      printf("%c", grid_ptr[i][j]);
    }
    printf("\n");
  }

  return 0;
}

void init(char *array) {
  int i,j;
  for (i=0; i<21; i++) {
    for (j=0; j<80; j++) {
      *array[i][j] = ' ';
    }
  }
  for (i=0; i<21; i++) {
    *array[i][0] = '|';
    *array[i][79] = '|';
  }
  for (i=0; i<80; i++) {
    *array[0][i] = '-';
    *array[20][i] = '-';
  }
}

错误属于这种性质:

main.c:27:16: error: subscripted value is not an array, pointer, or vector
      *array[i][j] = ' ';

【问题讨论】:

  • Even the error messages aren't helping me ...但他们可能会帮助我们。你得到什么错误?

标签: c arrays function pointers multidimensional-array


【解决方案1】:

如果有人使用不支持可选“可变长度数组”功能的 C 编译器(例如 Microsoft 编译器),这里有另一种方法:

void init( int rows, char (*array)[80] );

    // ... in main ...
    char grid[21][80];
    init(grid);          // use of grid_ptr is not required
    // ...

void init(int rows, char (*array)[80])
{
    int i,j;
    for (i = 0; i < rows; i++) {
      for (j = 0; j < 80; j++) {
        array[i][j] = ' ';

j 循环中,您可以将80 替换为sizeof *array。或者,您可以调用 memset 来替换整个 j 循环(实际上是两个循环)。

【讨论】:

  • 在没有标准编译器的情况下,我认为应该使用可变维度的“错位”二维数组init (int rows, int cols, char* array),或硬编码的“幻数”数组:init (char [21][80]) .这似乎是这两者的混合体。
【解决方案2】:

请允许我说,你无缘无故地让你的生活变得艰难! :) 你看,当一个人想要操作一个二维数组时,他可以直接在数组上工作,通过将数组本身传递给函数,就像这样:

#include <stdio.h>
#include <time.h>

void init(int n, int m, char array[n][m]);

int main(int argc, char *argv[]) {
  const int n = 21, m = 80;
  char grid[n][m];
  int i, j;
  init(n, m, grid);

  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      printf("%c", grid[i][j]);
    }
    printf("\n");
  }

  return 0;
}

void init(int n, int m, char array[n][m]) {
  int i,j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      array[i][j] = ' ';
    }
  }
  for (i = 0; i < n; i++) {
    array[i][0] = '|';
    array[i][m - 1] = '|';
  }
  for (i = 0; i < m; i++) {
    array[0][i] = '-';
    array[n - 1][i] = '-';
  }
}

这给出了这个可爱的矩形:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
--------------------------------------------------------------------------------
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
--------------------------------------------------------------------------------

现在请注意我对您的代码所做的更改:

  1. 我去掉了指向数组的指针,因为它是 多余的。
  2. 我将数组本身作为参数传递给函数,如 描述了here
  3. 我没有到处使用幻数(21 和 80),而是 声明了两个新的常量变量nm,它们是 二维数组的维度,n 行 x m 列。*
  4. 我使用维度来实现与您相同的逻辑 实施至今。请注意,我必须将它们作为函数传递 参数。

至于错误,它意味着您没有访问您认为正在访问的内容!但是,让我不要对此进行扩展,并在此处保持最小化。 :)


*现在,如果您想更改二维数组的尺寸,您只需更改一次n 和/或m,而不是代码中的任何地方(这很容易出错) )。

【讨论】:

  • 谢谢!正是我想要的!
  • 干得好,可能值得将 OP 介绍给允许您将参数 char array[n][m] 指定为 char (*array)[m] 的语法,这反映了当数组作为参数传递。 (并清楚说明为什么在函数中使用sizeof 的任何尝试都会失败)
  • 虽然我同意@DavidC.Rankin,但 M.M 的回答似乎触及到了这一点,我的回答已经很重要了.. :) 谢谢!
  • @DavidC.Rankin 该语言有意允许您以这种方式传递数组,这样我们就不必担心数组衰减、数组指针和按引用传递等事情。引入数组指针只会让代码变得丑陋。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多