[英]Returning a pointer of a multidimensional array
我是Java程序员,我正在努力解决这些简单的问题。
我怎样才能返回这个多维数组? 是否必须返回**指针? 我如何在另一个文件中获取它?
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
MoveDirection** get_ghost_moves() {
return ghost_moves;
}
2D数组不是指向指针的指针。 数组和指针在C和C ++中基本上是不同的类型。 数组衰变为指向其第一个元素的指针(因此两者之间经常混淆),但它只在第一级衰减:如果你有一个多维数组,它会衰变为指向数组的指针,而不是指向数组的指针指针。
get_ghost_moves
的正确声明是将其声明为返回指向数组的指针:
static MoveDirection ghost_moves[GHOSTS_SIZE][4];
// Define get_ghost_moves to be a function returning "pointer to array 4 of MoveDirection"
MoveDirection (*get_ghost_moves())[4] {
return ghost_moves;
}
这种语法语法非常混乱,所以我建议为它创建一个typedef:
// Define MoveDirectionArray4 to be an alias for "array of 4 MoveDirections"
typedef MoveDirection MoveDirectionArray4[4];
MoveDirectionArray4 *get_ghost_moves() {
return ghost_moves;
}
#define MAX 20
char canopy[20][MAX];
typedef char frank[MAX];
frank friend[MAX];
frank *getList()
{
return friend;
}
void test(int n)
{
frank *list = getList();
int i;
for (i = 0; i < 5; i++ )
{
printf("list[%d] %s\n\r", i, list[i]);
}
}
int main(void)
{
int i, nf;
for (i = 0; i < 5; i++ )
{
snprintf(friend[i], MAX, "test%d", i);
printf("test[%d] %s \n\r", i, friend[i]);
}
test(5);
return 0;
}
不,只需要一个*即可。 关键是要考虑数据在内存中的排列方式:数组只是一系列相同类型的项目,在内存中连续排列。 在这种情况下,数组的形状或大小并不重要 - 您只是返回一个指向它开头的指针,这意味着您将返回第一个项目的地址。
当然,无论你返回指针的是谁,都必须知道数组的形状和大小。
关于C和指针的一个好处是,一切都只是一个数字,而内存只是一个很大的字节数组。 一旦你这样思考就会感到舒服,那一切都会落到实处。
ghost_moves
在内存中占用一组连续的GHOSTS_SIZE*4
MoveDirections:它相当于一个MoveDirection*
它不能与指针指针一起使用,而是使用单个指针。
如果你想使用两个operator[]
-s索引你的数组,你有两个选择:
使用类型的变量: MoveDirection (*ghost_moves) [GHOST_SIZE]
然后只做ghost_moves[i][j]
这主要是指向指针,通常不是一个好的解决方案:拥有ghost_moves
类型的MoveDirection**
例如:
MoveDirection ghost_moves_original[GHOST_SIZE][4]; MoveDirection *ghost_moves[GHOST_SIZE]; ghost_moves[0] = ghost_moves_original; ghost_moves[1] = ghost_moves_original + GHOST_SIZE; ...
多维数组不是指针数组。 它是一个单独的内存块。 它只在声明范围内有意义。
你不能像在这里那样干净利落地返回..你必须返回一个MoveDirection[GHOSTS_SIZE][4]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.