为什么C++中字符数组和整数数组的基本属性有区别?

Kes*_*arg 2 c++ arrays

如果我执行此代码:

#include<iostream>
using namespace std;

int main(){
    char str[20] = {'a','b','c','d','e'};
    cout<<str<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它输出abcde但如果我执行此代码:

#include<iostream>
using namespace std;

int main(){
    int arr[20] = {1,2,3,4,5};
    cout<<arr<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它输出0x7fff22eecc30我尝试在两个不同的在线编译器中执行此代码,并且它们给出相同的输出。

char array它返回数组的内容,但在int array它返回的内存地址。这是为什么?另外,两个不同的在线编译器如何返回相同的内存地址?

我试过在网上寻找这个,但我不知道要寻找什么?

Bat*_*eba 5

使用char str[20] = {'a','b','c','d','e'};,数组的其余 15 个元素都设置为 0。由于数组衰减到指向该数组第一个元素的指针而使用的特殊ostream重载将输出数组,就好像它是 C 样式字符串一样,因为第一个 0 将充当 NUL 终止符。<<str char*

上面写的等效方法是char str[20] = "abcde".

在第二种情况下,过载<<ostream一个const void*指针用于(由于再次指针衰减),打印数组的第一元素的地址。