你为什么期望它起作用?您声明p
为char**
,并尝试将 a 分配char[2][5]
给它。将char[2][5]
隐式转换为 a char (*)[5]
,但之后,您有一个指针,并且没有进一步的隐式转换。(编辑:除了void*
。)
如果你仔细想想,这应该是显而易见的。如果你取消引用 a 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
更可取。)