Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 库特<&书信电报;with char*参数打印字符串,而不是指针值_C++ - Fatal编程技术网

C++ 库特<&书信电报;with char*参数打印字符串,而不是指针值

C++ 库特<&书信电报;with char*参数打印字符串,而不是指针值,c++,C++,这: const char*terry=“你好”; cout您应该将代码更改为: const char * terry = "hello"; cout<<terry; cout“hello”是一个字符串,即char数组const char*是指向此数组的指针,因此当您取消引用此指针时,将获得第一个元素的值 就好像你有 cout << static_cast<const void*>(terry); inta[]={1,2,3}; int*b=a; cout

这:

const char*terry=“你好”;

cout您应该将代码更改为:

const char * terry = "hello";
cout<<terry;
cout“hello”是一个字符串,即char数组
const char*
是指向此数组的指针,因此当您取消引用此指针时,将获得第一个元素的值

就好像你有

cout << static_cast<const void*>(terry);
inta[]={1,2,3};
int*b=a;

cout原因是
std::cout
将把
char*
视为指向C样式字符串(第一个字符)的指针,并将其打印出来。如果您想要地址,您可以将其强制转换为一个不按这种方式处理的指针,例如:

int a[] = {1, 2, 3};
int *b = a;
cout << *b << endl;
虽然在这种特殊情况下没有必要,但将其转换为
void*
将很好。以下示例代码显示了所有这些选项的作用:

cout << static_cast <const void *> (terry);

请注意,在使用
静态_cast
时,应确保不要尝试使用
静态_cast
丢弃常量(这就是
静态_cast
的目的)。这是新的C++版本所做的检查之一,旧的样式表没有这个限制。

<代码> cOUT/COD>被重载,这样当你给它一个<代码> char */CUL>时,它将打印成一个C风格字符串的指针。因此,它会打印出字符,直到碰到一个空终止字符


如果您使用
printf
而不是
cout
,您将看到地址。您还可以将指针强制转换为另一种类型,例如
(void*)
,您还可以获得地址。

std::cout
定义为
std::ostream
,定义为
运算符为什么我没有获得内存地址?@Mr.Puff如果您想获得char指针的内存地址,您应该在之前将其强制转换为void指针,因为
ostream它不会将
char*
值视为C样式的字符串;它将其视为指向C样式字符串(第一个字符)的指针。这只会对那些不知道自己在做什么的人造成危险。在这种情况下,常量的下降是不相关的,因为你没有对指针做任何事情。是的,如果你扔掉了指针,然后又不正确地使用了它,我会同意,但我希望语言的实践者能够学会如何安全地使用它。我没有让我儿子开始使用我的更危险的工具,直到他证明他知道这些工具的问题:-)我只看到在C++中使用C样式转换的两个原因:1。强制转换到不可访问的基类;2.懒惰再输入几个字符。你谈论懒惰就好像它是一件坏事。只有当存在实际的递减效应时才是糟糕的,否则这就是所谓的效率。在这种特殊情况下,使用旧样式转换没有问题,它们和其他语言一样是C++语言的一部分(即使是CSTDIO之类的东西,只要你理解这些问题就可以接受)。但是,我可以看出,我不太可能说服你。纯粹主义者和实用主义者之间的斗争似乎正在此起彼伏,双方都有各自的观点,但我们不妨讨论vi与emacs:-)因此,我建议你投票表决你的良心,让人民来决定。我将添加较新的样式作为选项,但我仍然认为在这种情况下不需要。我能想到的另一个“特殊”情况是尝试打印函数指针,它将选择
bool
重载(除非函数具有流操纵器的签名):(无可否认,它打印“值”指针转换为
bool
,因此这比
const char*
case)KeithThompson“不那么特殊”,这意味着
操作符
printf
本身的
重载版本
无法决定它的打印方式,您仍然必须使用正确的格式说明符,同样的方法,你必须在C++中使用相同的类型。例如,带有
%s的
printf
与带有
char*
cout
的问题完全相同。要获取指针,您需要使用格式说明符
%p
。这是否回答了您的问题?
cout << static_cast <const void *> (terry);
#include <iostream>
int main (void) {
    const char *terry = "hello";
    std::cout << terry << '\n';
    std::cout << (void *) terry << '\n';
    std::cout << (const void *) terry << '\n';
    std::cout << static_cast<const void *> (terry) << '\n';
    return 0;
}
hello
0x8048870
0x8048870
0x8048870
const char * terry = "hello";
cout << terry; // prints "hello"
cout << *terry;   // prints "h"
cout << terry[0]; // the same
cout << static_cast<const void*>(terry); // prints something like 0x4008e4
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                     const char* s );
basic_ostream& operator<<( const void* value );