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]);
?)打印字符串?我们必须知道您的
主函数
字符**
的作用,或者我们只是猜测。。。