C ++:数组和内存位置

时间:2014-12-13 13:59:57

标签: c++ arrays

一系列角色总是引起我的兴趣。

让我们创建一个整数类型的数组 -

int a[]={1,2,34};
cout<<a;

在这种情况下,cout<<a为我们提供了数组a

的位置

可是 -

char a[]="C++";
cout<<a;

给我们C++作为显示,非常有趣。

1)那么为什么在与cout一起使用时,字符数组不会显示其内存位置?

2)如何找到字符数组的位置?

所有帮助将不胜感激:)

- C ++新手,有学习意愿

3 个答案:

答案 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 );