为何char指针输出整个字符数组,int指针仅输出地址?如何打印两者地址?
C++中char指针与int指针cout输出差异及数组地址打印方法
为什么char指针输出整个数组,int指针仅输出地址?
std::cout对char*类型有专门的重载实现:它会将char*视为C风格字符串,从指针指向的内存位置开始逐个输出字符,直到遇到'\0'(空字符)才停止。你的chars数组用单个字符初始化,没有显式添加'\0',但刚好后续内存中存在'\0'(属于偶然情况),所以输出了整个数组的内容。这种写法其实存在未定义行为——如果后续内存没有'\0',cout会持续读取越界内存,直到找到'\0'为止。- 对于
int*类型,std::cout没有专门的字符串处理重载,会直接输出指针存储的数值,也就是数组首元素的内存地址。
如何打印两个数组的地址?
要打印指针(或数组)的内存地址,需要将指针转换为void*类型——std::cout对void*的处理逻辑是输出其指向的内存地址。数组名本身就是指向首元素的指针,因此可以直接转换后输出。
修改后的代码示例:
#include <iostream> using namespace std; int main() { char chars[] = {'a','b','g','j','z'}; char *ptr1 = chars; // 打印char指针/数组的地址 cout << static_cast<void*>(ptr1) << endl; cout << static_cast<void*>(chars) << endl; // 数组名直接转void* int arr[] = {1,2,3,4,5}; int *ptr2 = arr; // 打印int指针/数组的地址 cout << static_cast<void*>(ptr2) << endl; cout << static_cast<void*>(arr) << endl; // 数组名直接转void* return 0; }
执行后会输出类似以下的地址(地址值取决于系统环境):
0x7ffd836e4350 0x7ffd836e4350 0x7ffd836e4360 0x7ffd836e4360
内容的提问来源于stack exchange,提问作者Rishabh Verma
相关产品推荐
相关产品推荐

