c ++:function arg char**与char*[]不同

cvs*_*ave 4 c++ arrays pointers arguments

我正在使用g ++.我正在使用具有main(int,char**)重命名的代码,因此我可以调用它.我看着我应该在C中使用char**argv还是char*argv []?,char**据说相当于char* [].这在c ++函数调用中似乎不正确.例如:

void f1(char** p){;}

void f2(char* p[]){

   f1(p);

 //...`

}
Run Code Online (Sandbox Code Playgroud)

失败,编译器抱怨"无法转换char (*)[]char**..."引用我想说数组转换为调用指针,但似乎不是这样的情况:

void f3(char* [] p);

char caa[16][16];  
f3(caa);
Run Code Online (Sandbox Code Playgroud)

也失败了.我假设只要间接水平相同(例如char*** ptrchar[][][] carray),这些类型是可以互换的.

有人可以提供我可以查看的参考,澄清这些问题吗?

谢谢.

Pav*_*aev 12

这在C++中仍然适用.如果您的编译器在您描述第一个案例时抱怨,那么它就是不符合要求的.

为了解释你的第二个案例,重要的是要了解实际发生的情况.数组类型的表达式可隐式转换为相应的指针类型,即:T[n]- > T*.但是,如果T它本身是一个数组,则不会特别处理这种情况,并且数组到指针的衰减不会传播.所以T*[n]衰减到T**,但T[x][y]只会衰减到T[y]*,并没有进一步.

从实现的角度来看,这是有道理的,因为如果允许的话,进一步衰减会给出T**,这是指向指针的指针; 而2D C数组并未实现为锯齿状数组(即指向数组的指针数组) - 它们形成一个连续的内存块.所以,T*数组中没有"内部"来取一个地址来给你一个T**.对于允许的情况,典型的实现只是将数组的地址作为一个整体并将其转换为指向单个元素的指针类型(当底层指针表示对于所有类型都相同时,通常情况下,此转换是一个运行时无操作).

这里的规范性引用是ISO C++ 03,4.2 [conv.array]/1:

可以将"数组NT"或"未知T的数组"的左值或右值转换为"指向T的指针"的右值.结果是指向数组的第一个元素的指针.