了解char引用

时间:2012-02-12 23:43:21

标签: c++ pointers 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,我不明白为什么我有这个输出。

3 个答案:

答案 0 :(得分:13)

原因是cout“知道”如何处理char *值 - 它将字符串打印为NUL终止的C字符串。

int *值也是如此,因此cout会打印指针值。

您可以通过强制转换强制指针值输出:

cout << static_cast<void *>(&letters[i]) << endl;

答案 1 :(得分:2)

您正在研究C ++流的特性。它试图将其参数转换为通常可打印的内容。此表达式的类型为&ints[x] int*&chars[x]变为char*,顺便提一下,它也是C字符串的类型。因为我们希望这个cout << "FOO"'打印出整个字符串,所以需要这种行为。在您的情况下,这实际上会导致未定义的行为,因为您使用的字符串未正确地以null结尾。要解决此问题,请使用static_cast

答案 2 :(得分:2)

当您传递ostream::operator<<(实际上它是一个全局函数,而不是运算符)char*类型的参数时,它被视为以null结尾的字符串。