-4
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]
4

2 回答 2

3

你为什么期望它起作用?您声明pchar**,并尝试将 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更可取。)

于 2013-09-26T12:54:43.327 回答
-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));

希望这可以帮助。

于 2013-09-26T13:15:20.410 回答