我有以下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数组的奇怪输出。
答案 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);