char数组地址的意外输出

时间:2016-01-05 16:30:21

标签: c++ arrays pointers

我有以下C ++代码 -

#include<iostream>

using namespace std;

int main(){

char a[]={'0','1','2','3','4','5','6'};
char* p=a;

cout<<p;

return  0;
}


这里的指针p包含char数组a的地址。
输出是 -

01234565ÿ"


我使用了一个整数数组,它给出了一个简单的十六进制地址作为输出。
请解释一下char数组的奇怪输出。

4 个答案:

答案 0 :(得分:2)

a投射为void*以避免调用std::iostream::operator<<(const char*)

#include<iostream>

int main()
{
    char a[]={'0','1','2','3','4','5','6'};
    std::cout << static_cast<void*>(a) << std::endl;
}
  

请为char数组解释这个奇怪的输出。

std::iostream::operator<<()存在各种参数类型,每种参数类型的处理方式不同:

  • std::iostream::operator<<(const char*)打印一个C风格的字符串,这是您在编写std::cout << p时调用的内容。
  • std::iostream::operator<<(const void*)将指针打印为十六进制整数,这是您在编写std::cout << static_cast<void*>(a)时调用的内容。
  

我使用了一个整数数组,它给出了一个简单的十六进制地址作为输出。

如果您声明了一个整数数组,打印它将不会调用const char*版本,而是调用const int*版本(如果它存在)。由于未定义,编译器默认为const void*,因为指针可以隐式转换为const void*

#include<iostream>

int main()
{
    int a[]={'0','1','2','3','4','5','6'};
    const int* p = a;
    std::cout << p << std::endl; // prints address of a.
}

答案 1 :(得分:2)

您将其打印为字符串。因此它将从a的开头打印所有字符,直到它看到一个0x0,这是字符串的结尾

如果向阵列添加终止,例如:

char a[]={'0','1','2','3','4','5','6', 0x0};
char* p=a;

cout<<p;

然后输出将是:

0123456

如果要打印a的地址(而不是数组中的值),则需要将char *转换为void * first

cout << static_cast<void*>(p);

答案 2 :(得分:2)

输出流运算符将(const) char*的参数解释为以NUL结尾的字符串。由于您的字符序列不是NUL终止的(例如'\0'),因此123456之后会出现垃圾。

任何其他指针类型确实会被解释为指针和输出。因此,如果您将p转换为其他类型,例如

cout << static_cast<const void*>(p);

您将获得预期的结果。

答案 3 :(得分:2)

cout有一个overload,需要const char *并打印其内容。由于char*可以传递给函数const char *,因此这是被调用的函数。它将从指针指向的数组的开头继续打印,直到它看到null(0)元素。这就是为什么你得到额外的输出,因为你的数组不是空终止。如果您想打印您需要使用的地址

cout << static_cast<const void*>(p);