c ++指针: - 为什么这段代码没有运行

时间:2013-09-26 12:41:44

标签: c++ pointers

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]

2 个答案:

答案 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));

希望这会有所帮助。