繁体   English   中英

char** 和 char* 的区别

[英]Difference between char** and char*

所以我的 main 中有一个二维数组(我认为): char* map[width][height] = {MATRIX HERE};

我将它传递给 function: bool canAccessEdge (char** map, int size, int currentPosX, int currentPosY);

我通过 via: canAccessEdge (*map, 10, playerStartPosX, playerStartPosY);

我想遍历 map 数组并标记玩家已经在的位置。 但我知道我不能更改 function 中索引处的值。我知道char map [][]将是一个数组,而char *map是一个指针。 那么什么是char* map [][] 是否可以在不更改原型的情况下进行变通? 对不起,如果这些是愚蠢的问题......我不能很好地掌握指针/数组。

bool exitPossible (char** map, int size, int currentPosX, int currentPosY) {
    ...
    *maze[currentPosX][currentPosY] = "V"; // Operand of '*' must be a pointer but has type "char"
    (&maze)[currentPosX][currentPosY] = "V"; // Changes whole row and not the right position
    &(maze)[currentPosX][currentPosY] = "V"; // Expression must be a modifiable lvalue (I assume it's immutable)
    ...
}

char[N]可以降级为char* 并不意味着char[N][M]可以降级为char** 初学者总是做出这样的假设,但事实并非如此。

char*[N][M]又是另一回事了。 那不是char的二维数组(这似乎是您想要的)。 二维字符数组是char[N][M] 对于二维字符数组,正确的语法是

maze[currentPosX][currentPosY] = 'V';

注意单引号。

如果要将二维字符数组传递给 function,那么最简单的方法是使用二维字符数组声明 function

bool exitPossible(char maze[N][M], ...)

但实际情况是这里的maze是一个指向一维数组的指针,实际上不可能在C++中有一个数组作为function参数。所以function的真实声明是

bool exitPossible(char (*maze)[M], ...)

在这里我们看到了真正的maze ,一个指向一维数组(大小为 M)的指针。 这就完成了上面的第一段。 二维数组char[N][M]不会降级为char** ,而是降级为char (*)[M] 如果这看起来很复杂,那么你是对的,需要一本好书来完整解释它。

请注意,在所有这些讨论中, NM都是常数 在 C++ 中,数组大小不能可变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM