在C++中,字符数组和整型数组的指针

3

我正在尝试理解C++中的指针和数组。我注意到在下面的代码中,输出a可以正确地给出array中第一个元素的地址,但输出c却给出了pk而不是一个地址。

int array[3]={4,7,2};
int * a;

a= array;

char Carray[3]={'p','k','\0'};
char * c;

c= Carray;

cout << a << "\n";
cout << c << "\n";

这是寻找 Carray 第一个元素地址的不正确方法吗?还是这与 cout 对整数和字符数组指针的解释方式有些怪异。

输出:

Ox23fe30
pk

请展示一下您从这些语句中得到的输出。 - turbulencetoo
C风格字符串是以空字符\0结尾的char数组,并且cout假定您传递给它一个C风格字符串。因此,获取第一个元素地址的方法是正确的,但是对于intcharcout对该地址的解释不同。 - triple_r
除非你特别要求与C语言进行比较之类的,否则不要在C++问题中标记C - 这两种语言及其惯用答案可能会有很大的不同。 - crashmstr
5个回答

7

这是关于cout如何解释指向字符数组的一个特殊情况。

当给出一个指针时,cout将打印地址,除非它是一个char*,在这种情况下,它将把指针解释为c风格字符串(指向以空字节结尾的字符数组的指针)。

要打印字符数组的地址,请先将其强制转换为void*cout << reinterpret_cast<void*>(c) << "\n";


5

使用 c,您正在调用 operator<<(std::istream&, char*)。这仅打印字符,直到遇到 '\0',就像普通的 C 风格字符串一样。

使用 aoperator<<(std::istream&, int*) 打印地址。


从技术上讲,我认为重载是 operator<<(std::istream&, void*) - Mooing Duck

1
在C语言中,字符序列是以空字符结尾的char[]数组,这被称为"C的怪癖"。cout允许使用C风格的字符串,因此它会将字符指针输出为字符串。请注意,保留HTML标签。

0

cout 对待 char 指针和 int 指针的方式不同,因此您获取第一个数组元素地址的方法是正确的。


0
在C和C++中,char指针通常被视为以NULL结尾的字符串。对于如cout这样的STL流,char指针绝对被视为以NULL结尾的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接