指向具有功能的2D数组的指针

时间:2016-09-07 01:11:07

标签: c arrays function pointers multidimensional-array

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

这是我的代码:

#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] = ' ';

2 个答案:

答案 0 :(得分:4)

请允许我说你无缘无故地努力工作! :)你看到当一个人想要操纵一个2D数组时,他可以通过将数组本身传递给函数来直接处理数组,如下所示:

#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 您的2D数组的维度,n行x m列。 *
  4. 我使用维度来实现你所拥有的逻辑 到目前为止实施。请注意,我必须将它们作为函数传递 参数也是如此。
  5. 至于错误,这意味着您没有访问您认为正在访问的内容!但是,让我不要扩展这一点,并在这里保持最小化。 :)

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

答案 1 :(得分:0)

如果有人使用的C编译器不支持可选的&#34;可变长度数组&#34;功能(例如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。或者您可以通过调用j替换整个memset循环(实际上是两个循环)。