繁体   English   中英

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

[英]c++: function arg char** is not the same as char*[]

我正在使用g ++。 我正在使用具有main(int,char**) ,重命名以便我可以调用它。 我看着我应该在C中使用char ** argv还是char * argv []? ,其中char**被认为等同于char* [] 这在c ++函数调用中似乎不正确。 例如:

void f1(char** p){;}

void f2(char* p[]){

   f1(p);

 //...`

}

失败,编译器抱怨“无法将char (*)[]转换为char** ...”引用我想说数组被转换为调用的指针,但似乎并非如此:

void f3(char* [] p);

char caa[16][16];  
f3(caa);

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

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

谢谢。

这在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的指针”的右值。结果是指向数组的第一个元素的指针。

 void f2(char* p[]){ 

编译器抱怨“ cannot convert char (*)[] to char**...

奇怪。 char(*)[]是一个指向chars数组的指针 ,但在你的代码片段中,该函数有char *p[]参数,这意味着char的指针数组 这些类型确实不同(因为数组元素具有不同的大小),更不用说您的代码片段完美编译了。 你真的拼错了一些东西。

Sherlock Holmes模式 :还是涉及到typedef? ;-)

void f1(char** p){;}

typedef char type[];
void f2(type * p){
   f1(p);
}

这实际上不会编译并产生您引用的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM