了解字符引用
Understanding char reference
我写了这个简单的脚本来理解什么是引用,但我被困在 char 数组上。
int numbers[5] = {3, 6, 9, 12, 15};
for (int i = 0; i < 5; i++)
{
cout << numbers[i] << endl;
cout << &numbers[i] << endl;
}
cout << "--------------" << endl;
char letters[5] = {'a', 'b', 'c', 'd', 'e'};
for (int i = 0; i < 5; i++)
{
cout << letters[i] << endl;
cout << &letters[i] << endl;
}
这是输出:
3
0xbffff958
6
0xbffff95c
9
0xbffff960
12
0xbffff964
15
0xbffff968
--------------
a
abcde
b
bcde
c
cde
d
de
e
使用int
数组,当我使用 &numbers[i]
时,我收到一个奇怪的数字,这是一个内存位置。 这没关系;这正是我所理解的。
但是有了char
,我不明白为什么我有这个输出。
原因是
cout
"知道"如何处理char *
值 - 它将字符串打印为以 NUL 结尾的 C 字符串。
int *
值并非如此,因此cout
打印指针值。
可以通过强制转换来强制输出指针值:
cout << static_cast<void *>(&letters[i]) << endl;
您正在查看C++流的特殊性。它尝试将其参数转换为通常可打印的内容。此表达式的类型为 &ints[x]
int*
。 顺便说一下,&chars[x]
变成char*
这也是 C 字符串的类型。由于我们希望此cout << "FOO"'
打印出整个字符串,因此需要具有此行为。在您的情况下,这实际上会导致未定义的行为,因为您使用的字符串未正确以 null 结尾。要解决此问题,请使用static_cast
。
当你将
类型char*
的参数传递给ostream::operator<<
(实际上它是一个全局函数,而不是运算符(时,它被认为是一个以空值结尾的字符串。
相关文章:
- 成本字符*类型的非常量引用的无效初始化,并且来自常量字符*类型的临时引用
- 对 'i2c_smbus_read_word_data(int, 无符号字符)的未定义引用
- 分配取消引用的字符指针真的不可能吗?
- C++通过引用传递字符串与通过引用传递字符数组
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 如何在C++中引用字符串的有限字符
- 为什么 std::string 的 back() 应该返回对字符的引用?
- 字符串引用和常量字符指针的函数重载
- C++ [链接器错误] 未定义对"执行计算(字符,双精度)"的引用
- 通过引用传递字符阵列
- 使用引用返回静态字符数组
- 取消引用无符号字符指针并将其值存储到字符串中
- 在C/C++中取消对字符指针的引用
- 为什么在动态数组中自动取消引用字符指针
- std::string运算符[]如何返回引用而不是字符
- 字符串的C++向量,为什么赋值会导致相同的字符引用
- 取消引用指向字符指针 c++ 的指针
- 通过引用字符 2 维调用字符串不起作用
- 将取消引用字符迭代器转换为 int C++
- 函数复制引用字符数组中的数据