此问题已在此处有答案:
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
为什么第一个指针打印整个字符数组,而第二个指针只打印地址?
我想打印两个数组的地址。
3条答案
按热度按时间e3bfsja21#
在上面的代码行中,
"hello world\n"
的类型是一个13char
的常量数组,其值为{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'}
。除非你做一些额外的工作,否则像这样的数组会衰减为指向第一个元素的指针。所以:
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终止的缓冲区的指针和不是的指针,所以他们选择了更常见的一个。n53p2ov02#
它们被写成这样主要是因为人们认为(我猜大部分是正确的)这样会很有用。
至于想要打印地址,你通常想先转换为
void *
。这对于打印地址来说应该是相当可靠的(事实上,这无疑是你现在打印int
指针的方式,仅仅因为它是唯一可用的可以接受int *
类型参数的重载)。js5cn81o3#
operator〈〈with char* operands的实现假设操作数指向一个以nil结尾的C字符串并打印C字符串。对于其他指针类型的操作数,它不做任何假设,只打印指针本身。这就是它的定义。不能更改它。如果你想打印指针值,请将其转换为void*。