C++ 将字符[]转换为字符**
我有一个C++ 将字符[]转换为字符**,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我有一个char[][] char c[2][2]={ {'a','b'}, {'c','d'} }; 如何将其转换为char** 这里的目标是使用转换后的char**作为主函数的输入,主函数只接受char**作为其输入。两种C/C++解决方案都可以接受。您不能将字符[2][2]转换为字符**,只能将其转换为字符(*)[2] char (*p)[2] = c; 上面是指向2字符数组的指针。请注意,您需要这个2,不能只写char**p,因为在后一种情况下,您无法执行指针
char[][]
char c[2][2]={
{'a','b'},
{'c','d'}
};
如何将其转换为char**
这里的目标是使用转换后的
char**
作为主函数的输入,主函数只接受char**
作为其输入。两种C/C++解决方案都可以接受。您不能将字符[2][2]
转换为字符**
,只能将其转换为字符(*)[2]
char (*p)[2] = c;
上面是指向2字符数组的指针。请注意,您需要这个
2
,不能只写char**p
,因为在后一种情况下,您无法执行指针算术(指针在递增时不知道要“跳转”多少个元素,您也无法寻址数组的元素(在本例中为行))
- 您的
是一个二维数组,所有元素都连续存储。为了访问一个元素,编译器计算知道每行大小的偏移量李>char[2][2]
指向包含指向char的指针的数组。要访问一个元素,编译器将计算指针在最左边的偏移量,加载该指针,然后访问该元素李>char**
char *pc[2]={c[0],c[1]};
cout << pc[1][1]<<endl; // prints out the same as c[1][1]
// you can pass `pc` when a `char**` is needed
char*pc[2]={c[0],c[1]};
cout您可以像这样将数组传递到函数中:
char c[2][2] = {
{'a','b'},
{'c','d'}
};
char* x[] { c[0], c[1] };
func(x); // Assuming something like: void func(char** p);
void func(char** c)
{
for(int x = 0; x < 2; ++x)
for(int y = 0; y < 2; ++y)
std::cout << c[x][y] << ' ';
std::cout << '\n';
}
int main(int, char* argv[])
{
// one contiguous block of 4 chars
char c[2][2]={
{'a','b'},
{'c','d'}
};
char** param = new char*[2]; // create your own pointer array
param[0] = &c[0][0]; // assign the first element of each char array
param[1] = &c[1][0];
func(param); // call your func
delete[] param; // cleanup
}
注意:尽管此答案可以很好地解释/说明问题,但建议创建自动变量的其他答案更可取char*[2]代码>而不是像这个答案那样分配新的
原始答案:
问题是char c[2][2]
是char
的连续块。编译器只分配4个char
对象
构建数组数组(char**c
)时,需要手动将指针数组分配给char
,然后将char
和数组分配(或分配)给每个指针
因此,要将数组char c[2][2]
转换为数组,必须首先创建指针数组,然后将每个char数组的第一个元素的数组分配给该数组
大概是这样的:
char c[2][2] = {
{'a','b'},
{'c','d'}
};
char* x[] { c[0], c[1] };
func(x); // Assuming something like: void func(char** p);
void func(char** c)
{
for(int x = 0; x < 2; ++x)
for(int y = 0; y < 2; ++y)
std::cout << c[x][y] << ' ';
std::cout << '\n';
}
int main(int, char* argv[])
{
// one contiguous block of 4 chars
char c[2][2]={
{'a','b'},
{'c','d'}
};
char** param = new char*[2]; // create your own pointer array
param[0] = &c[0][0]; // assign the first element of each char array
param[1] = &c[1][0];
func(param); // call your func
delete[] param; // cleanup
}
再读一遍这个问题,他大概想使用以null结尾的字符串。@KarolyHorvath是的!我刚刚意识到并加了一句额外的话。@KarolyHorvath说得好!如果用户打算调用execvp()
/execvpe()
,则肯定是。main()
函数不得在程序内调用(标准,3.6.1)。在所有其他情况下,这当然取决于函数,如果有一个计数器可以标识最后一个元素。@KarolyHorvath不,我不是指以null结尾的字符串。无论如何,原始问题中没有说明。谢谢。@zell:是的,但不是直接的。“主函数的输入”char*param[2]
将远远优于char**param=new char*[2]代码>@MattMcNabb是的,我同意。我将把这个拿下来。“McMcNabb OK,所以现在我不能删除这个,指向其他答案C或C++?您是希望在char**
中只复制一个char[][]
还是希望转换为字符串指针数组的char**
?(例如,您是否试图最终能够使用printf(“%s\n”,数组[i]);
?)打印字符串?我们必须知道您的主函数
对字符**
的作用,或者我们只是猜测。。。