这在C ++中是可能的:
const char* ch = "hello";
但是这样的事情是不可能的:
int* i = { 1, 2, 3 };
char *ch
和int* i
都是普通指针。为什么可以为char*
分配多个字符,而int*
无法分配多个整数?
我知道我们可以使用
int x[] = {1, 2, 3};
但这不是问题。
答案 0 :(得分:15)
const char* ch = "hello";
有点像
static const char string_literal[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
const char* ch = &string_literal[0];
除了每个相同的字符串文字不一定指向内存中的不同位置。
对于任何其他类型也是如此:
static int integer_list[] = { 1, 2, 3 };
int* i = &integer_list[0];
// or equivalently, just int* i = integer_list;
现在,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 };
您只需要定义一次模板,然后每个不同的用户都可以将该模板用于用户感兴趣的特定值。
const int* i = int_array<1, 5, 6>::values;
通常,简单地定义一个单独的数组变量会更容易,但在某些情况下,这样的模板会有所帮助。
正如评论中所指出的,可以更一般地定义模板,以便它适用于任意类型和任意长度的数组,但它需要一个对当前版本的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... };
现在,此阵列的用户的语法是
const int* i = static_array<int, 1, 2, 3, 4>::values;
const unsigned* j = static_array<unsigned, 1, 2, 3, 4, 5>::values;
答案 1 :(得分:4)
字符串文字是一个字符数组。请注意,ch
只是指向单个字符的指针,因此它实际上并不指向整个字符串,而只指向其基址(第一个字符的地址)。初始化列表(即{1, 2, 3}
)不一个数组,因此不能用于初始化指针。
答案 2 :(得分:3)
字符文字被编译为二进制数据段中的一段初始化存储。 const char *
是指向该存储的指针。
事实上,如果只有你拥有内存块的地址,那么const int *
应该可以这样做。 可以使用内联汇编程序(但我从未尝试过)指定.data
段。