初始化char*vs int*

cod*_*ddy 19 c++

这在C++中是可能的:

const char* ch = "hello";
Run Code Online (Sandbox Code Playgroud)

但是这样的事情是不可能的:

int* i = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

这两个char *chint* i是普通的指针.为什么可以char*分配多个字符而int*不能分配多个字符?

我知道我们可以使用

int x[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但这不是问题.

小智 15

const char* ch = "hello";
Run Code Online (Sandbox Code Playgroud)

有点像

static const char string_literal[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
const char* ch = &string_literal[0];
Run Code Online (Sandbox Code Playgroud)

除了每个相同的字符串文字不一定指向内存中的不同位置.

对于任何其他类型也是如此:

static int integer_list[] = { 1, 2, 3 };
int* i = &integer_list[0];
// or equivalently, just int* i = integer_list;
Run Code Online (Sandbox Code Playgroud)

现在,i[0]1,i[1]2,i[2]3.

字符串文字有一种特殊的语法,因为它们经常被使用,并且在上下文中经常使用虚拟变量使代码混乱.

如果你有很多使用静态分配的整数类型只读数组的代码,你可以使用模板隐藏样板:

template <int a, int b, int c>
struct int_array { static const int values[3]; };
template <int a, int b, int c>
const int int_array<a, b, c>::values[] = { a, b, c };
Run Code Online (Sandbox Code Playgroud)

您只需要定义一次模板,然后每个不同的用户都可以将该模板用于用户感兴趣的特定值.

const int* i = int_array<1, 5, 6>::values;
Run Code Online (Sandbox Code Playgroud)

通常,简单地定义单独的数组变量会更容易,但在某些情况下,这样的模板会有所帮助.

正如评论中所指出的,可以更一般地定义模板,以便它适用于任意类型和任意长度的数组,但它需要一个最新的编译器,对当前版本的C++有很好的支持(对于GCC)和clang,当前版本没问题,但请确保传递-std=c++11-std=gnu++11选项以启用C++ 11功能):

template <typename T, T... v>
struct static_array {
  static const T values[sizeof...(v)];
};

template <typename T, T... v>
const T static_array<T, v...>::values[sizeof...(v)] = { v... };
Run Code Online (Sandbox Code Playgroud)

现在,这个数组的用户的语法是

const int* i = static_array<int, 1, 2, 3, 4>::values;
const unsigned* j = static_array<unsigned, 1, 2, 3, 4, 5>::values;
Run Code Online (Sandbox Code Playgroud)

  • @KarolyHorvath完成. (4认同)