int main(int argc, char** argv) {
char a[2][5]={"hell","worl"};
char **p;
p=a; // error here
cout<<*(*(a+1)+1);
cout<<endl;
cout<<(*a)[2];
return 0;
}
错误:
C:\Dev-Cpp\main.cpp [Error] initializer-string for array of chars is too long [-fpermissive]
答案 0 :(得分:3)
为什么你期望它能起作用?您将p
声明为char**
,
并尝试为其分配char[2][5]
。 char[2][5]
将隐式转换为char (*)[5]
,但之后,您
有一个指针,没有进一步的隐式转换。 (编辑:void*
除外。)
如果你考虑一下,那应该是显而易见的。如果你取消引用
一个char**
,你得到一个char*
。这个char*
必须驻留
在内存中的某个地方,因为你有一个指向它的指针。那么在哪里
是吗?
如果要迭代示例中的外部数组:
char (*p)[5] = a;
std::cout << *p[0] << sdt::endl;
std::cout << *p[1] << sdt::endl;
请注意,您的表达式*(*(a+1)+1)
也会假设您
在某处有一个指针数组。
或者,您可以在使用C样式时使用常用解决方案 字符串:
char const* const a[] = { "hell", "worl" };
和
char const* const* p = a;
在这种情况下,你确实有一个指针数组 隐式转换为指向指针的指针(第一个元素 数组)。
(当然,你唯一真正想要使用C风格的时候
字符串是带有静态生命周期的const变量。在
大多数情况下,std::string
更可取。)
答案 1 :(得分:-1)
访问a [2] [5]的其他方式是,
char **p=(char**)a;
获得[0]
printf("\n a[0] is [%s]", ((char*)p));
获得[1]
printf("\n a[1] is [%s]", (((char*)p) + strlen(a[0])+1));
希望这会有所帮助。