c++ 为什么字符指针打印整个char数组而整数指针没有?[重复]

u0sqgete  于 2023-04-08  发布在  其他
关注(0)|答案(3)|浏览(185)

此问题已在此处有答案

Displaying the address of a string(4个答案)
6天前关闭
我正在学习cpp中的指针,我写了这段代码,但当我运行这段代码时,结果与我预期的不同,但为什么呢?

#include <iostream>

using namespace std;

int main()
{
    char chars[] = {'a','b','g','j','z'};
    char *ptr1 = chars;
    cout << ptr1 << endl;
    
    int arr[] = {1,2,3,4,5};
    int *ptr2 = arr;
    cout << ptr2;

    return 0;
}

这段代码的输出是:

abgjz
0x7ffd836e4360

为什么第一个指针打印整个字符数组,而第二个指针只打印地址?
我想打印两个数组的地址。

e3bfsja2

e3bfsja21#

std::cout << "hello world\n";

在上面的代码行中,"hello world\n"的类型是一个13 char的常量数组,其值为{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'}
除非你做一些额外的工作,否则像这样的数组会衰减为指向第一个元素的指针。所以:

auto str = "hello world\n";

str的类型为char const*,它指向h
根据C的约定,指向字符的指针通常被视为指向nul(非NULL)终止缓冲区的指针,并表示字符串。
以这种方式使用char const* s是C中的常规约定,事实上,如果没有将char const* Package 在typedef中以隐藏它,那么它不引用nul终止的字符串将是不寻常的。
因此std::ostream被教导使用这些char const*作为nul终止字符串,并打印每个字符串,直到找到一个'\0'字符(其位值都是0)。
对于其他指针,则打印它们的地址。
没有简单的方法来区分char const*是指向nul终止的缓冲区的指针和不是的指针,所以他们选择了更常见的一个。

n53p2ov0

n53p2ov02#

它们被写成这样主要是因为人们认为(我猜大部分是正确的)这样会很有用。
至于想要打印地址,你通常想先转换为void *。这对于打印地址来说应该是相当可靠的(事实上,这无疑是你现在打印int指针的方式,仅仅因为它是唯一可用的可以接受int *类型参数的重载)。

js5cn81o

js5cn81o3#

operator〈〈with char* operands的实现假设操作数指向一个以nil结尾的C字符串并打印C字符串。对于其他指针类型的操作数,它不做任何假设,只打印指针本身。这就是它的定义。不能更改它。如果你想打印指针值,请将其转换为void*。

相关问题