printf() 和 std::cout 在指针方面的区别
difference between printf() and std::cout with respect to pointers
我是指针的新手,我想不出一件简单的事情。
int main ()
{
char *str1="pointer";
printf("%p \n", str1);
cout << str1<<endl;
return 0;
}
输出如下:
0000000000409001
pointer
谁能解释一下这里的区别。
为什么 cout 不打印内存地址?如何让 cout 打印 str1 的地址?
一个 char* 是指向字符数组开头的指针。
cout
"recognizes" 一个 char* 并将其视为字符串。
您明确告诉 printf() 使用 %p 格式化程序打印出指针地址的十进制表示形式。
您明确告诉 printf() 使用 %p 格式化程序打印出 指针地址的表示。
编辑:根据评论进行了准确性编辑
格式说明符 %p
打印 void *
,(不正确:因此 char *
被隐式转换为 void *
) char *
被转换为void *
打印前。 (但这实际上是未定义的行为,请参阅评论。正确的做法是 printf("%p", (void *) str1);
)相应的 C++ 代码将是 std::cout << (void *) str1 << '\n';
.
代码 std::cout << str1;
将 str1
打印为空终止字符串。相应的 C 代码为 printf('%s', str1);
指针是指向内存中某个位置的地址。
"pointer"
是内存中的 C 字符串,8 个字节用于字母和一个终止 NULL 字节。 str1
是指向第一个字母'p'
.
字节的指针
printf("%p", str1)
打印指针本身的值,即内存地址(在本例中为 0000000000409001
)。
printf("%s", str1)
将打印 pointer
,位置 str1
.
的 C 字符串的内容
cout << str1 << endl
也打印 C 字符串的内容。这是 char*
类型指针的默认行为,因为它们通常是字符串。
cout << static_cast<void*>(str1) << endl
会再次打印指针的地址。
我是指针的新手,我想不出一件简单的事情。
int main ()
{
char *str1="pointer";
printf("%p \n", str1);
cout << str1<<endl;
return 0;
}
输出如下:
0000000000409001
pointer
谁能解释一下这里的区别。 为什么 cout 不打印内存地址?如何让 cout 打印 str1 的地址?
一个 char* 是指向字符数组开头的指针。
cout
"recognizes" 一个 char* 并将其视为字符串。
您明确告诉 printf() 使用 %p 格式化程序打印出指针地址的十进制表示形式。
您明确告诉 printf() 使用 %p 格式化程序打印出 指针地址的表示。
编辑:根据评论进行了准确性编辑
格式说明符 %p
打印 void *
,(不正确:因此 char *
被隐式转换为 void *
) char *
被转换为void *
打印前。 (但这实际上是未定义的行为,请参阅评论。正确的做法是 printf("%p", (void *) str1);
)相应的 C++ 代码将是 std::cout << (void *) str1 << '\n';
.
代码 std::cout << str1;
将 str1
打印为空终止字符串。相应的 C 代码为 printf('%s', str1);
指针是指向内存中某个位置的地址。
"pointer"
是内存中的 C 字符串,8 个字节用于字母和一个终止 NULL 字节。 str1
是指向第一个字母'p'
.
printf("%p", str1)
打印指针本身的值,即内存地址(在本例中为 0000000000409001
)。
printf("%s", str1)
将打印 pointer
,位置 str1
.
cout << str1 << endl
也打印 C 字符串的内容。这是 char*
类型指针的默认行为,因为它们通常是字符串。
cout << static_cast<void*>(str1) << endl
会再次打印指针的地址。