C:如何正确声明字符串数组?

7 c

我看到了两个:

const char*  arr = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

const char*  arr[] = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

什么是正确的,通常标准的方式?

两个有什么区别?

有什么区别

   const char**arr = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

    const char* arr[] = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

   const char* * const arr = {"foo", "bar"};    
Run Code Online (Sandbox Code Playgroud)

   const char* const * const arr = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

抱歉这么多问题,只是想更好地理解它......

CB *_*ley 12

这是不正确的,因为它没有正确的间接级别.

const char* arr = {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

这是不正确的,因为它缺少了=.它看起来有点像函数定义.

const char* arr[] {"foo", "bar"};
Run Code Online (Sandbox Code Playgroud)

这是通常的正确形式.

const char* arr[] = { "foo", "bar" };
Run Code Online (Sandbox Code Playgroud)

编辑

您无法初始化聚合初始值设定项的指针(即{...,...,...}).你可以做到这两点

const char* str1 = "A string";
Run Code Online (Sandbox Code Playgroud)

const char str2[] = "Another string";
Run Code Online (Sandbox Code Playgroud)

但这是不同的.

字符串文字的类型为'n of char',因此可以转换为指针,而初始化列表实际上不是数组,它只是初始化数组的一种方法.

  • 如果你在旧代码中看到它,我建议它需要修复.它初始化`arr`(一个const char**),其中const char*指向"foo"并丢弃多余的initalizers.我得到"警告:从不兼容的指针类型初始化"和"警告:标量初始化程序中的多余元素" (2认同)

Bil*_*oag 5

关于constness ...

const char* constValue = "foo";
constValue = "bar";
constValue[0] = 'x'; // will not work

char* const constPtr = "foo";
constPtr = "bar"; // will not work
constPtr[0] = 'x';

const char* const arr[] = { "foo", "bar", 0 }; // all const
Run Code Online (Sandbox Code Playgroud)

'const char * const'通常是完全恒定的东西的最佳解决方案。如果在本地作用域中声明此静态变量,则还要进行优化。0 ptr对于标记值很有用。