首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么调用cout.operator<<(const char*)打印地址而不是字符串?

调用cout.operator<<(const char*)打印地址而不是字符串的原因是因为cout是一个输出流对象,它的operator<<函数被重载了多次,其中一个重载函数接受const char*类型的参数,该参数被解释为一个C风格的字符串,而不是一个地址。

在C++中,C风格的字符串是以空字符('\0')结尾的字符数组。当我们使用cout输出一个C风格的字符串时,它会自动遍历字符数组并输出每个字符,直到遇到空字符为止。因此,如果我们传递一个指向字符数组的指针给cout.operator<<(const char*),它会将该指针解释为一个C风格的字符串,并输出字符串的内容。

如果我们传递一个指针给cout.operator<<,而该指针指向的并不是一个以空字符结尾的字符数组,而是一个普通的地址,那么cout会将该指针解释为一个地址,并输出地址的值。这就是为什么调用cout.operator<<(const char*)打印地址而不是字符串的原因。

在实际开发中,如果我们想要输出一个字符串而不是地址,可以使用cout.operator<<(const std::string&)重载函数,该函数接受std::string类型的参数,可以正确地输出字符串的内容。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(ECS):提供可扩展的计算能力,满足各种业务需求。产品介绍链接
  • 云数据库 MySQL 版(CDB):高性能、可扩展的关系型数据库服务。产品介绍链接
  • 云原生容器服务(TKE):基于 Kubernetes 的高度可扩展的容器管理服务。产品介绍链接
  • 人工智能开放平台(AI):提供丰富的人工智能服务和工具,帮助开发者构建智能应用。产品介绍链接
  • 物联网开发平台(IoT):提供全面的物联网解决方案,支持设备接入、数据管理和应用开发。产品介绍链接
  • 移动推送服务(TPNS):高效、可靠的移动消息推送服务,帮助开发者实现消息推送功能。产品介绍链接
  • 云存储(COS):安全、稳定的对象存储服务,适用于各种数据存储需求。产品介绍链接
  • 区块链服务(BCS):提供一站式区块链解决方案,帮助企业快速搭建和管理区块链网络。产品介绍链接
  • 腾讯云游戏引擎(GSE):提供全球覆盖的游戏托管服务,支持快速部署和运行游戏。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 流插入和流提取运算符的重载

— 1 — << 运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 提出问题: 那这条语句为什么能成立呢? cout 是什么?...为什么 << 运算符能用在 cout 上呢? 原因: 实际上,cout 是在 iostream 头文件中定义的 ostream 类的对象。...char * s) { .... // 输出s字符串的代码 return *this; } 那么在使用流插入<<运算符时,等价于的形式如下: 01 数据类型是int类型时: std:...:cout << 1; 上面的语句,等价于: cout.operator<<(1); 02 数据类型是字符串类型时: std::cout << "hello"; 上面的语句,等价于: cout.operator..."); — — 假定我们要想把某个对象里的内容进行打印输出,那么我们可以重载 ostream 类的流插入 << 运算符。

1.1K10

C++ endl的本质是什么

但是,如果我们定义char c=endl;会得到一个编译错误,这说明endl并不是一个字符,所以应该到系统头文件中去查找endl的定义。...如果把endl当做一个模板函数,那么cout<<endl可以解释成cout.operator<<(endl);由于一个函数名代表一个函数的入口地址,所以在cout的所属类ostream中应该有一个operator...也就是说,cout对象的<<操作符接收到endl函数的地址后会在重载的操作符函数内部调用endl函数,endl函数会结束当前行并刷新输出缓冲区。...原因是对于一个函数而言,函数名本身就代表函数的入口地址函数名前加&也代表函数的入口地址。 3.endl其实是IO操纵符 实际上,endl被称为IO操纵符,也有翻译成IO算子。...cout.operator<<(),完成格式操纵符的功能。

1.3K30

C++ Primer Plus习题及答案-第十七章

编译器将类似cout << spot的表达式解释为cout.operator<<(spot),这样,它便能够将该方法调用与具有相同参数类型的函数原型匹配。 5....cin.get(ch);不忽略空格和换行符,且第一次输入的回车键,也会被cin.get(ch);捕捉到,因此ct2的值应为9。打印内容如下: ct1 = 5; ct2 = 9 9....index; i++) pc[i]->writeall(fout);// fout ofstream connected to output file 【注意】: 对于这个练习,应使用文本I/O,不是二进制...该程序将键盘输入读取到一个由string对象组成的vector中,将字符串内容(不是string对象)存储到一个文件中,然后该文件的内容复制到另一个由string对象组成的vector中。...Store的构造函数应接受一个指定ifstream对象的参数,重载的operator( )(const string &)应指出要写入到文件中的字符串

3K30

c++系列之二 指向成员函数的指针(烧脑)

现在,我们所能知道的是,编译器准确地知道要调用哪个函数。这就是所谓的“静态绑定”。因为成员函数可以静态绑定(并不是总能静态绑定,待会儿讨论),所以它们的地址是在编译阶段决定的(同样并不是永远如此)。...偏移量 不是 绝对地址 。...*fptr)(0); // 调用 FooDerived::f(),不是 Foo::f() //偏移量 Bar obj; ( obj....字符串目的地;4. 字符串来源。上述代码中字符串来源是两个字符串常量"Strings "和"concatenated!",而成员函数指针数组被用来根据菜单选项执行相应的打印动作。...成员函数调用和 this 指针 现在我们回到文章最开始的地方。为什么一个空指针也能调用成员函数?

2.8K20

熬夜整理的万字CC++总结(二),值得收藏

0.为什么使用指针 假如我们定义了 char a=’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 a(...在数据传递时,如果数据块较大,可以使用指针传递地址不是实际数据,即提高传输速度,又节省大量内存。...思考如下问题: int a = 0xaabbccdd; unsigned int *p1 = &a; unsigned char *p2 = &a; //为什么*p1打印出来正确结果?...printf("%x\n", *p1); //为什么*p2没有打印出来正确结果? printf("%x\n", *p2); //为什么p1指针+1加了4字节?...这就意味着:这种数据传递是单向的,即从调用者传递给被调函数,被调函数无法修改传递的参数达到回传的效果。

1.2K20

C语言学习——sprintf函数详细解释及其用法

函数功能: 把格式化的数据写入某个字符串 头文件:   stdio.h 函数原型:   int sprintf( char *buffer, const char *format, [ argument...] … ); 参数列表:   buffer:char型指针,指向欲写入的字符串地址。   ...返回值:字符串长度(strlen) 相关函数:   int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format, [argument...如果你想看si 的本来面目,那么就应该让编译器做0 扩展不是符号扩展(扩展时二进制左边补0 不是补符号位):   sprintf(s, “%04X”, (unsigned short)si);...”%u”把他们打印出来:   sprintf(s, “%u”, &i);   不过通常人们还是喜欢使用16 进制不是10 进制来显示一个地址:   sprintf(s, “%08X”, &i

3.4K20

【C进阶】——详解10个C语言中常见的字符串操作函数及其模拟实现

字符串的首字符地址传给函数,用指针接收,用该指针遍历字符串,如果指针指向的内容不是’\0’,计数器++,指针继续向后移动,直至遇到’\0’停止,返回计数器的值。...那我们将它的返回值以字符串形式打印出来应该就是helloworld,虽然后面还有,但我们知道打印到’\0’就结束了嘛,我们看看是不是: 我们现在拿到了被分割符分开的第一个字串helloworld,如果我们还行拿到后面的...当我们想从上次的第一个分隔符的位置继续向后分割字符串拿到strtok时,我们需要再次调用strtok函数,但是这次第一个参数我们应该NULL,为什么呢?...3次,那以后操作其它的字符串,是不是调用次数也要变啊。...接下来我们再次调用函数就需要传空指针了,恰好调整部分就是str = strtok(NULL, p),这样正好符合我们的需求。 然后判断部分为str !

57510

【C指针详解】进阶篇

应该不是的,pstr是一个字符指针,是用来存放字符的地址的,"hello bit."是一个字符串,即使我们想把它放到pstr中,也是不可行的。 那这句代码的结果是啥呢?...const char* pstr = “hello bit.”; ——本质上是把字符串 “hello bit.” 首字符 h 的地址放到了pstr中,使得指针pstr指向该字符串。...是一个常量字符串常量字符串是不能被修改的,在内存中仅保留一份。 这也是有时候在代码最前面加上const的原因(const char* str3 = “hello bit.”;)。...指针str3和str4指向的是同一个常量字符串,它们存储的都是字符串"hello bit."的首字符’h’的地址,所以str3和str4本质上是一样的 2....实际上: &arr 表示的是整个数组的地址arr是数组首元素的地址。 所以,arr和&arr打印出来才会不一样。

21710

C++中endl的本质是什么

但是,如果我们定义char c=endl;会得到一个编译错误,这说明endl并不是一个字符,所以应该到系统头文件中去查找endl的定义。...如果把endl当做一个模板函数,那么cout<<endl可以解释成cout.operator<<(endl);由于一个函数名代表一个函数的入口地址,所以在cout的所属类ostream中应该有一个operator...也就是说,cout对象的<<操作符接收到endl函数的地址后会在重载的操作符函数内部调用endl函数,endl函数会结束当前行并刷新输出缓冲区。...原因是对于一个函数而言,函数名本身就代表函数的入口地址函数名前加&也代表函数的入口地址。 3.endl其实是IO操纵符 实际上,endl被称为IO操纵符,也有翻译成IO算子。...cout.operator<<(),完成格式操纵符的功能。

83610

Linux进程控制

那么为什么给父进程返回的就是子进程的pid,给子进程返回的就是0呢? 就好比孩子只能有一个亲生的父亲,一个父亲可以拥有很多亲生孩子,每个孩子都是独立不同的。...进程终止 退出码 在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,不是返回其他的,亦或者是不写都可以...int execl(const char *path, const char *arg, …); 第一个参数是说如何找到程序,第二个参数是我们在命令行解释器怎么调用该程序就怎么写,最后用NULL结尾。...int execvpe(const char *file, const char *argv[], …,char *const envp[]); 这个参数就不说了,都说过了。...我们输入一个字符串是abc,然后会按回车,也就是说实际上是abc\n,如果我要在打印信息%s后面加一个\n那么就会多出一行,不加容易出现缓冲区不刷新问题,所以我们要去除输入末尾的\n。

2.9K00

【C++】深度剖析string类的底层结构及其模拟实现

为什么第10行这里打印就崩了呢,不是返回一个空指针吗?那就打印空指针啊。 ,这里不是这样的,这里程序挂掉的原因就在于对返回的空指针解引用了。 为什么会解引用?...这里返回的是const char*类型的指针,我们说cout是会自动识别类型,它这里会以字符串的形式去打印,也就是说它不是打印这个指针,而是去解引用打印它指向的字符串,遇到\0,停止,而这里返回的是空指针...对象是可以被修改的,现在_str指向一个常量字符串,它有可能直接就是在常量区的,那我们后面扩容是不是也没法搞啊,而且这里还加了const,所以就修改不成了。...,我们说了范围for底层是用的迭代器,而我们现在只实现了普通迭代器,那范围for替换成调用迭代器,这里的s是const对象,去调用普通迭代器(非const成员函数),是不是又是权限放大啊。...来看: 这里换一下位置就不行了,为什么呢? 因为这样的话就是s去调==了,s是const对象,调的是非const成员函数,就不行了。

21310

C语言指针深度解剖

= 'b'; printf("%c\n", ch);//b 但其实对于字符指针,还有以下用法: //字符串 const char* str = "abcdef"; //char* str = "...因此,对于str来说,它指向的是字符串首字符的地址,也就是字符a的地址。然后我们在使用%s来打印的时候,会从a的地址开始找,一直打印整个字符串,直到遇到'\0'就停止。...下面来看看一道问题,来对上面所说的进行一个加深理解: 有下面代码,我们来分析一下打印的结果是什么: int main() { const char* p1 = "abcdef"; const char...回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。...意思就是我们创建的这个函数,不是我们直接取调用的,比如我们创建了一个Add函数,我们直接拿来做加法运算,这就不是回调函数了。而是我们用在另外的函数或特点的事件上,由它们来进行特点调用

42220

开发成长之路(3)-- C语言从入门到开发(讲明白指针和引用,链表很难吗?)

指针类型有两个最基本的操作: &:取地址操作 *:去引用 (间接引用)操作 引用& 首先,&不是地址运算符,而是类型标识符的一种,就像*也不是指针运算符一样。...swap_b(&a,&b); //看仔细咯,这个是指针调用 //如果理解不了,这样理解:参数中的*和&只是走个过场,告诉人家那个参数是什么类型的 //调用函数时的参数是a,不是*a,也不是&a...通过传递引用不是整个数据对象,可以提高程序的运行速度。 指针 指针和constconst用于指针有一些很微妙的地方。 可以用两种不同的方式将const关键字用于指针。...通过指针返回字符串的函数 现在,假设需要一个返回字符串的函数,是的,函数无法返回一个字符串,但是可以返回字符串地址,这样效率更高。...函数指针 关于为什么要使用函数指针,我的理解还不是很深刻,毕竟功力不足。但是我知道那些回调函数都是用函数指针的,所以对函数指针必须要理解好。 这叫啥,“但行好事,莫问为啥”。

54020

STL&string&模拟实现

= s.end())//注意要使用不等号不是小于号,因为某些数据结构地址空间不一定是连续的 { cout<< *it_left << " "; it_left += i; } //或者 for..._str); } 为什么要strlen(s._str) + 1,因为strlen只获取字符串的有效字符个数,不获取字符串结尾符号\0 但是strcpy函数会把被拷贝的字符串s...._str)//&为取地址 { //所以,先将原来的字符串的空间释放掉,就避免了原字符串过大或过小的问题 delete[] _str; _str = new char...*格式的字符串,然后打印 第二种写法是遍历整个string,然后逐个打印 第一种方式在遍历C格式的字符串的时候,遇到\0就会终止,认为字符串已经结束 第二种方式会遍历整个string string s...in.get()是获取缓冲区中的(任何)一个字符,无论是不是终结符。这样就能确保ch拿到缓冲区里面的每一个字符,然后再判断时候终止循环。

5410

iOS底层原理总结 - 探寻Runtime本质(四)

为什么结果是相同的?super关键字在调用方法的时候底层调用流程是怎样的?...另外我们在回到run方法内部,很明显可以发现,如果super不是从父类开始查找方法,从本类查找方法的话,就调用方法本身造成循环调用方法crash。...两种调用方法的内存信息 通过上图我们可以发现两种方法调用方式很相近。那么obj为什么可以正常调用方法?...通过上图我们可以发现,obj在调用test方法时,也会通过其内存地址找到cls,cls中取出最前面8个字节空间其内部存储的刚好是Person类对象地址。因此obj是可以正常调用方法的。...获取成员变量的相关信息,传入成员变量信息,返回C语言字符串 const char *ivar_getName(Ivar v) 6.

89840

指针详解(冒泡排序、qsort、回调函数、转移表)(三)

回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。...回调函数不是由该函数的实现方直接调用,而是在 特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 相同(相似)的代码出现了多份,就显得有些冗余,有没有办法,简化一些呢?...3、使用转移表查找相应的操作函数,并将其调用。 4、将结果存储在一个变量中,并将其打印出来。 为什么要用NULL?...char *s1,const char * s2) 这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。...确切数值是依赖不同的C实现的。 当两个字符串不相等时,C 标准没有规定返回值会是 1 或 -1,只规定了正数和负数。 有些会把两个字符的 ASCII 码之差作为比较结果由函数值返回。

10410

C 标准库基础 IO 操作总结

打开文件的函数: #include FILE *fopen(const char *path, const char *mode); FILE 是 C 标准库定义的结构体类型,其包含文件在内核中的标识...stdin 只用于读操作,称为标准输入 stdout 只用于写操作,称为标准输出 stderr 也用于写操作,称为标准错误输出 通常程序的运行结果打印到标准输出,错误提示打印到标准错误输出,一般标准输出和标准错误都是屏幕...main 函数首地址 printf("%%\n"); // 打印一个 % scanf 就是从标准输入中读取格式化数据,简单举个例子: int year, month, day...int sscanf(const char *str, const char *format, ...); int sprintf(char *str, const char *format, ...)...; int snprintf(char *str, size_t size, const char *format, ...); sscanf 是从输入字符串中按照指定的格式去读取相应的数据,函数功能非常的强大

93630
领券