了解字符引用

Understanding char reference

本文关键字:引用 字符 了解      更新时间:2023-10-16

我写了这个简单的脚本来理解什么是引用,但我被困在 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<<(实际上它是一个全局函数,而不是运算符(时,它被认为是一个以空值结尾的字符串。