----------------------------------------------------------------------------------
Yours Sincerely
Kun
www.forwind.cn
http://twitter.com/lk_517
2009/11/18 Tinyfool <tiny...@gmail.com>:
如果要按照底层本质理解,多维和一维肯定都是一样的,存储同种类型的一片空间而已。
但这里的问题说为啥不能传,明显是语法层面上的问题
----------------------------------------------------------------------------------
Yours Sincerely
Kun
www.forwind.cn
http://twitter.com/lk_517
2009/11/18 Tinyfool <tiny...@gmail.com>:
把f的声明改为
void f(char p[][100])
你直接cast p成char **当然有问题,你只能把二维数组的首地址强制转换为一维指针。
----------------------------------------------------------------------------------
Yours Sincerely
Kun
www.forwind.cn
http://twitter.com/lk_517
2009/11/19 jinhu wang <wangji...@gmail.com>:
On 11月19日, 下午1时56分, jinhu wang <wangjinhu...@gmail.com> wrote:
On 11月19日, 下午3时43分, jun lin <linjunhal...@gmail.com> wrote:
> 想了一下,脑袋晕了。char ** argv == char * argv [], 为什么这里就不行?
>
> 2009/11/19 jinhu wang <wangjinhu...@gmail.com>
>
> > 实际用的时候我是这么传的:
> > char p[100][100];
> > char *pp[100];
> > for(int i=0;i<100;++i)
> > {
> > pp[i]=p[i];
> > }
> > f(pp);
> > 如果直接强转换传p进去会crash掉,没想明白
>
> > 2009/11/19 Tinyfool <tinyf...@gmail.com>
>
> >> 对啊,我已经说了怎么可以传了。。。
>
> >> 就我的经验而言,我觉得楼主是遇到了一个函数有char**p的参数,不知道传什么进去好。然后就以为ar[][]是char**的逻辑,所以就传了过去,但是结果不对。
>
> >> 我也给了一个例子,
>
> >> char ar[]="test";
> >> f(&ar);
>
> >> 在我的经验里面很多程序员都容易把二维数组理解为char**。
>
> >> 2009/11/19 windstorm <likunarmstr...@gmail.com>
>
> >>> 如果不规定讨论层面的话,很容易跑题的
>
> >>> 如果要按照底层本质理解,多维和一维肯定都是一样的,存储同种类型的一片空间而已。
>
> >>> 但这里的问题说为啥不能传,明显是语法层面上的问题
>
> >>> ----------------------------------------------------------------------------------
> >>> Yours Sincerely
> >>> Kun
>
> >>>www.forwind.cn
> >>>http://twitter.com/lk_517
>
> >>> 2009/11/18 Tinyfool <tinyf...@gmail.com>:
> >>> > 语法当然要注意,但是实质确实是一个东西
>
> >>> > 2009/11/19 alai <ala...@gmail.com>
>
> >>> >> 没错,在C的底层实现和内存布局上,char[10][10]与char[100]是一样的。但是在语法上还是不能随便互转的。
>
> >>> >> 2009/11/19 Tinyfool <tinyf...@gmail.com>
>
> >>> >>> 按照c的逻辑确实可以这么说
>
> >>> >>> 2009/11/19 alai <ala...@gmail.com>
>
> >>> >>>> 不能说 ar 就是 char*,如果是的话,那么 ar[0] 就是 char 了。
>
> >>> >>>> 2009/11/19 Tinyfool <tinyf...@gmail.com>
>
> >>> >>>>> ar的其实就是char*,二维数组是说他的下标是两维,不是说有两重的指针。
> >>> >>>>> 如果你想给void f(char**p);传参数,你可以
> >>> >>>>> char ar[]="test";
> >>> >>>>> f(&ar);
>
> >>> >>>>> 2009/11/19 alai <ala...@gmail.com>
>
> >>> >>>>>> 因为 ar 的类型不是 char**,而是 (char[10])*
>
> >>> >>>>>> 2009/11/19 jinhu wang <wangjinhu...@gmail.com>
>
> >>> >>>>>>> void f(char**p);
> >>> >>>>>>> 这个函数为何不能传入下面这样的参数?
> >>> >>>>>>> char ar[10][10];
> >>> >>>>>>> f(ar);
>
> >>> >>>>> --
> >>> >>>>> Tinyfool的开发日记http://www.tinydust.net/dev/
> >>> >>>>> 代码中国网http://www.codechina.org
> >>> >>>>> myTwitter:http://twitter.com/tinyfool
>
> >>> >>> --
> >>> >>> Tinyfool的开发日记http://www.tinydust.net/dev/
> >>> >>> 代码中国网http://www.codechina.org
> >>> >>> myTwitter:http://twitter.com/tinyfool
>
> >>> > --
> >>> > Tinyfool的开发日记http://www.tinydust.net/dev/
> >>> > 代码中国网http://www.codechina.org
2009/11/19 alai <ala...@gmail.com>:
jinhu wang 写道:
现在他们在"某些"情况下也是等价的~
2010/1/11 xiaofei huang <huangxia...@gmail.com>
其实在早期的C编译器里面二维数组和char **是等价的。我记得严蔚敏的《数据结构》里面霍夫曼树的那个例子里貌似还这么用过。不过C++的话可能编译器对这个等价并不赞同,毕竟直接使用"指向指针的指针”还是不太安全的,容易造成访问的混乱。