【发布时间】: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