一系列角色总是引起我的兴趣。
让我们创建一个整数类型的数组 -
int a[]={1,2,34};
cout<<a;
在这种情况下,cout<<a
为我们提供了数组a
可是 -
char a[]="C++";
cout<<a;
给我们C++
作为显示,非常有趣。
1)那么为什么在与cout一起使用时,字符数组不会显示其内存位置?
2)如何找到字符数组的位置?
所有帮助将不胜感激:)
- C ++新手,有学习意愿
答案 0 :(得分:2)
“1)那么为什么在与cout一起使用时,字符数组不会显示其内存位置?”
有一个专门的重载
std::ostream& operator<<(std::ostream&, const char*);
这就是为什么你总是看到打印的字符,而不是地址。
“2)如何找到字符数组的位置?”
如果要查看void*
数组的地址,可以转换为char
指针:
char a[]="C++";
cout << (void*)a;
或仅将地址运算符作为@WhozCraig
中建议的their comment作为前缀cout << &a;
答案 1 :(得分:0)
以下是运算符的两个重载&lt;&lt;可用标准: -
std::ostream& operator<<(std::ostream&, const char*); // _1
std::ostream& operator<<(std::ostream&, void*); // _2
int arr[] = {1,2,3};
cout << arr; // This would invoke _2
char arr[] = "Hello";
cout << arr; // This would invoke _1
char arr[] = "Hello";
cout << (void*)arr; // This would invoke _2
cout << &arr;
希望我很清楚
答案 2 :(得分:0)
首先考虑到整数数组没有operator <<
。
当你写这样的语句时
int a[] = { 1, 2, 34 };
cout << a;
然后将表达式a
隐式转换为类型const void *
的指针,以选择以下重载运算符
basic_ostream<charT,traits>& operator<<(const void* p);
对于字符数组,C ++标准明确定义类型为operator <<
const char *
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
const char*);
如果您希望字符数组被称为为operator <<
类型定义的const void *
,那么您必须显式地将指针强制转换为thjis类型。例如
char a[] = "C++";
cout << static_cast<const void *>( a );