在 C++ 中是可能的:
const char* ch = "hello";
但是像这样的事情是不可能的:
int* i = { 1, 2, 3 };
为什么char*
可以用多个字符赋值,而int*
不能用多个整数赋值?char *ch
和int* i
都是普通指针。
我知道我们可以使用
int x[] = {1, 2, 3};
但这不是问题所在。
在 C++ 中是可能的:
const char* ch = "hello";
但是像这样的事情是不可能的:
int* i = { 1, 2, 3 };
为什么char*
可以用多个字符赋值,而int*
不能用多个整数赋值?char *ch
和int* i
都是普通指针。
我知道我们可以使用
int x[] = {1, 2, 3};
但这不是问题所在。
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;
-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;
字符串字面量是字符数组。需要注意的是,ch
只是指向单个字符的指针,因此它实际上并不指向整个字符串,只是它的基础地址(第一个字符的地址)。初始化列表(即 {1, 2, 3}
)不是一个数组,因此不能用来初始化指针。
const char[6]
的字符串常量。表达式赋值所做的就是将任何“数组”分配给适当类型的指针,即表示第一个元素的地址。它不是某个初始化列表。它是一个数组,你正在保存它的第一个元素地址。唯一进行的初始化是使用该地址初始化指针。 - WhozCraigconst char *
是指向该存储器的指针。const int *
进行同样的操作。您可以使用内联汇编(但我从未尝试过)指定一个 .data
段来实现此操作。
"hello"
)是特殊的实体。 - πάντα ῥεῖchar *
。应该使用const char *
。 - Robert Allan Hennigan Leahychar* ch = "hello";
这是有效的 C 代码,但在 C++ 中无效(尽管它曾经也是有效的)。请适当标记您的问题。 - user743382char
和char*
。 - Lightness Races in Orbit