我想将这个指向二维数组的指针传递给一个函数:
数组:
*cmd[maxCmdSize][maxArgSize]
功能:
void performCmd(char *cmd[maxCmdSize][maxArgSize])
如何在不在函数中声明维度大小的情况下实现此操作?
我想将这个指向二维数组的指针传递给一个函数:
数组:
*cmd[maxCmdSize][maxArgSize]
功能:
void performCmd(char *cmd[maxCmdSize][maxArgSize])
如何在不声明函数维度大小的情况下实现此目标?
您无法省略数组的第二个维度。
因此,您需要将原型设置为:
void performCmd(int *cmd[][maxArgSize]);
并且像这样调用方法:
performCmd(cmd);
int *cmd [][maxArgSize]
等同于int *(*cmd)[maxArgSize]
),不需要传递并且不影响基于多维数组的指针算术运算。int performCmd(int maxArgSize, char *cmd[][maxArgSize]);
int performCmd(int maxArgSize, char *cmd[][*]); //compatible alternative declaration
int performCmd(int maxArgSize, char *cmd[][maxArgSize])
{
return &cmd[1][0]-&cmd[0][0]; //returns maxArgSize
}
在声明中(但不是定义中),VLA的大小可以用*
替代。
(在定义中,大小也可以是任何非const表达式(包括可能是函数调用),而不仅仅是一个简单的变量引用。)
如果没有VLA支持,您可以简单地传递指向基本类型和维数的指针,然后使用它来模拟基本数组上的多维指针算术。
例如,给定char x[2][3][4][5];
,&x[1]
表示(char(*)[3][4][5])x + 1
,(即(char*)x+1*(3*4*5)
),&x[1][1]
表示(char (*)[4][5])((char(*)[3][4][5])x+1) + 1
(即(char*)x+1*(3*4*5)+1*(4*5)
),等等。当数组维度是动态的时,这个方法同样适用,并且您可以使用这个方法将动态维度、基本指针和一组索引转换为偏移量,而不必依赖于VLA支持。
void performCmd(char** cmd, int maxCmdSize, int maxArgSize) {
//do whatever this function does
}