printf() 和 std::cout 在指针方面的区别

difference between printf() and std::cout with respect to pointers

本文关键字:指针 方面 区别 cout std printf      更新时间:2023-10-16

我是指针新手,我无法弄清楚一件简单的事情。

int main ()
{
char *str1="pointer";
printf("%p n", str1);
cout << str1<<endl;
return 0;
}

输出如下:

0000000000409001
pointer

有人可以解释一下这里的区别吗? 为什么 COUT 不打印内存地址?如何让 COUT 打印 str1 的地址?

格式说明符%p打印一个void *,(不真实:所以char *被隐式转换为void *(char *在打印前被转换为void *。(但这实际上是未定义的行为,请参阅注释。正确的方法是printf("%p", (void *) str1);(相应的C++代码将是std::cout << (void *) str1 << 'n';

代码std::cout << str1;str1打印为以 null 结尾的字符串。相应的 C 代码将被printf('%s', str1);

指针是指向内存中某个位置的地址。

"pointer"是内存中的 C 字符串,字母为 8 个字节,终止 NULL 字节。str1是指向第一个字母'p'的字节的指针。


printf("%p", str1)打印指针本身的值,即内存地址(在本例中为0000000000409001(。

printf("%s", str1)会打印pointer,C字符串在位置str1的内容。


cout << str1 << endl还打印 C 字符串的内容。这是类型char*指针的默认行为,因为它们通常是字符串。

cout << static_cast<void*>(str1) << endl将再次打印指针的地址。

char* 是指向字符数组开头的指针。

cout"识别"字符*并将其视为字符串。

您显式告诉 printf(( 使用 %p 格式化程序打印出指针地址的十进制表示形式。

您显式告诉 printf(( 使用 %p 格式化程序打印出指针地址的表示形式。

编辑:根据注释进行编辑以确保准确性