C 指向带有函数的二维数组的指针

C 指向带有函数的二维数组的指针,c,arrays,function,pointers,multidimensional-array,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 (*

我在理解指针如何处理二维数组时遇到了一些困难。即使是错误信息也帮不了我。我有一个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] = '-';
  }
}

请允许我说,你无缘无故地让你的生活变得艰难您可以看到,当一个人想要操纵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] = '-';
  }
}
现在请注意我对代码所做的更改:

我去掉了引用数组的指针,因为它是 冗余的 我将数组本身作为参数传递给函数,如下所示 描述。 我不再到处使用魔法数字21和80,而是 声明了两个新的常量变量n和m,它们是 二维数组的尺寸,n行x m列* 我使用维度来实现与您相同的逻辑 到目前为止已经实施。请注意,我必须将它们作为函数传递 参数也是。 至于错误,它意味着您没有访问您认为正在访问的内容!但我不想对此进行详细阐述,而是将其保持在最低限度


*现在,如果要更改2D数组的尺寸,只需更改n和/或m一次,而不是代码中容易出现错误的任何地方。

如果任何人使用的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循环中,可以用sizeof*数组替换80。或者你可以用一个对memset的调用来替换整个j循环,事实上这两个循环。

即使是错误消息也帮不了我。。。但他们可能会帮助我们。你会犯什么错误?谢谢!正是我要找的!做得好,可能需要将OP引入语法,该语法允许您将参数char array[n][m]指定为char*array[m],这反映了当数组作为参数传递时,第一级间接寻址到指针的转换。同时也明确了为什么任何在函数中使用sizeof的尝试都会失败。我同意@DavidC.Rankin,M.M的答案似乎触及了这一点,我的答案已经很大了谢谢@Rankin该语言有意允许您以这种方式传递数组,这样我们就不必担心数组衰减、数组指针和按引用传递之类的事情。引入数组指针只会让代码变得难看。在没有标准编译器的情况下,我认为应该使用可变维度的损坏2D数组、init int rows、int cols、char*数组或硬编码的幻数数组:init char[21][80]。这似乎是两者的混合体。
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
--------------------------------------------------------------------------------
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
--------------------------------------------------------------------------------
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] = ' ';