为什么c++ 中 指针数组 打印的不是地址而是字符串??

为什么c++ 中 指针数组 打印的不是地址而是字符串??

#include <iostream>

using namespace std;

int main(){
    char *str[3] = {"banana", "apple", "origin"};

    for(int i=0, i<3,++i) {
      cout << str[i] << endl;
    }

    return 0;
}
运行结果:
banana
apple
origin

所以为什么输出的是字符串呢,指针数组 str中的元素 不应该存放的是 地址嘛?
其实这个问题也可以转换为:为什么可以这样赋值 : char *str[3] = {"banana", "apple", "origin"};
关键是这样赋值之后还能输出?

补充一下,如果是一个 int类型的 指针数组 ,输出的结果我倒是能理解。

#include <iostream>

using namespace std;

int main(){

    int *ptr[3];

    int array_1[3] = {1, 8, 10};
    int array_2[2] = {12, 15};
    int array_3[4] = {11, 22, 33, 44};

    ptr[0] = array_1;
    ptr[1] = array_2;
    ptr[2] = array_3;

    for(int i=0, i<3,++i) {
      cout << ptr[i] << endl;
    }

    return 0;
}
运行结果:
0x61fda4
0x61fd9c
0x61fd80

“Devil组”引证GPT后的撰写:

  • 在 C++ 中,字符串字面量被视为字符数组,由一个以空字符('\0')结尾的字符序列组成。在这个程序中,"banana"、"apple" 和 "origin" 都是字符串字面量,它们都是字符数组,其类型是 const char *,也就是指向字符数组的指针。
  • 在定义指针数组 char *str[3] 时,每个元素都是指向 char 类型的指针,也就是指向字符数组的指针。因此,在把字符串字面量分配给 str 数组元素时,实际上是把字符串字面量的地址赋给了指向字符数组的指针。这就是为什么输出的是字符串而不是地址的原因。
  • 在程序中,当使用 cout << str[i] 语句打印 str 数组元素时,它实际上是打印指向字符数组的指针所指向的字符串,而不是打印指针本身的地址。因为 C++ 对于 char * 类型的指针会默认把它作为一个以空字符结尾的字符串来处理,直到遇到空字符才停止打印输出。

如果你想打印指针本身的地址,可以使用取地址符(&),例如 cout << &str[i]。

输出中str[]都没有写i,能实现你贴出的输出效果???
字符指针直接输出就是按字符串输出的。输出地址的话,你要取地址才行。这是规则。否则啥时候输出字符串呢???

gdb 时,发现str[0] 0x405029 std::piecewise_construct+41 "banana" ,可能和 cout 调用 分段构造函数有关系? 这块不太懂,后边搞懂这些构造函数回头再来看吧。