初始化字符* 与整数*
Initializing char* vs int*
在C++中是可能的:
const char* ch = "hello";
但是这样的事情是不可能的:
int* i = { 1, 2, 3 };
char *ch
和int* i
都是普通指针。为什么char*
可以分配多个字符,而int*
不能分配多个整数?
我知道我们可以使用
int x[] = {1, 2, 3};
但这不是问题所在。
const char* ch = "hello";
有点像
static const char string_literal[] = { 'h', 'e', 'l', 'l', 'o', ' ' };
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;
字符串文本是一个字符数组。请注意,ch
只是指向单个字符的指针,因此它实际上并不指向整个字符串,而只是指向其基址(第一个字符的地址(。初始值设定项列表(即{1, 2, 3}
(不是数组,因此不能用于初始化指针。
字符文本编译为二进制文件的数据段中的一段初始化存储。 const char *
是指向该存储的指针。
事实上,应该可以对const int *
做同样的事情,只要你有内存块的地址。 您可以使用内联汇编器(但我从未尝试过(指定.data
段来执行此操作。
- C++使用整数的压缩数组初始化对象
- 整数在VSCommunity2019,windows10中未初始化
- 为什么初始化 std::vector 时不能使用模板整数?
- 在标头中C++整数初始化
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 如何初始化整数+字符串数组
- 如何将整数重新初始化/设置为空值
- 使用整数初始化列表初始化长双精度的向量
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 使用 size_t 初始化循环变量时的整数下溢
- C++11 整数初始化
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 如何初始化无符号整数uint8_t
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 从签名的字符到整数,过早促销的价值初始化
- 如何使用整数初始化 GMP mpz_t
- 矢量类型 字符串,但当用整数初始化时
- Visual Studio 2010 SP1 中的 64 位整数初始化错误
- c++模板:用一个特定的整数初始化一个变量(作为类型)