【问题标题】:Passing 2D char array in C [duplicate]在C中传递二维字符数组[重复]
【发布时间】:2018-09-17 20:53:51
【问题描述】:

有一个警告显示不兼容的指针转换,并且在第 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;
}

【问题讨论】:

  • char s[2][2] 在作为函数参数传递时不会转换为 char **;它转换为char (*)[2]。任何告诉你两者是同义词的人都错了。
  • 那么我如何在不使用动态内存分配的情况下传递这个二维数组。感谢您的帮助。
  • @Rishabh 只需传递一个char *(指向矩阵开头的指针)并使用它来访问所有元素(例如*(grid + i*grid_count + j) = some_int; //same thing as grid[i][j] = some_int;
  • 代码可以使用 char (*cavityMap(int grid_count, char grid[][2])) [2] { ... }char **result; --> char (*result)[2];,但这有点难看。
  • 如果你的 C 工具链支持VLAs,你可以使用这些。大多数合理的 C 实现都可以;有些(例如 MS)没有。

标签: c arrays pointers parameters 2d


【解决方案1】:

正如其他人所说,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])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2013-03-28
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多