在C中传递2D char数组[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

有一个警告显示指针转换不兼容,第4行中也有一个注释“预期的char **但参数类型为char * [2]”。

但为什么请帮助和解释。这个问题可以通过动态内存分配来解决吗?

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
char** cavityMap(int grid_count, char **grid) {
  int i, j, max = 0;
  char y = 'X';
  if (grid_count == 1) {
    return grid;
  } else {
    for (i = 0; i < grid_count; i++)
      for (j = 0; j < grid_count; j++) {
        if (max < (int) grid[i][j]) {
          max = grid[i][j];
        }
      }
    for (i = 0; i < grid_count; i++)
      for (j = 0; j < grid_count; j++) {
        if (i != 0 && i != grid_count - 1 && j != 0 && j != grid_count - 1) {
          if (grid[i][j] == (char) max)
            grid[i][j] = y;
        }

      }

    return grid;
  }
  return 0;
}

int main() {
  int n = 2, i, j;
  char **result;
  char s[2][2];
  s[0][0] = '1';
  s[0][1] = '7';
  s[1][0] = '6';
  s[1][1] = '8';
  result = cavityMap(n, s);
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      printf("%c", result[i][j]);
    }
    printf("\n");
  }
  return 0;
}
c arrays pointers parameters 2d
1个回答
3
投票

正如其他人所说,char **achar a[][]不同

但是如果你有char a[n][n],你可以将它作为参数发送给函数,只要你也告诉函数n是什么。像这样

#include <stdio.h>

void
process_array(int n, char a[n][n])
{
  for (int i=0; i < n; i++)
    {
      for (int j=0; j < n; j++)
        printf("%c", a[i][j]);
    }
}

int
main()
{
  char a[2][2] = {{'h', 'o'}, {'l', 'a'}};

  process_array(2, a);

  printf("\n");
}

哦,顺便说一句,如果你的阵列不是正方形,你应该可以做到

void
process_array(int n, int m, char a[n][m])

这里的要点是,当在现代c中将数组声明为函数参数时,数组维度不必是这样的常量:

void
process_array(char a[2][2])

请记住,数组总是作为函数参数中的指针传递,因此在sizeof(a)中执行process_array将返回指针的大小

© www.soinside.com 2019 - 2024. All rights reserved.