cout输出流

cout语句的一般格式为:
cout<<表达式1<<表达式2<<……<<表达式n;
cin语句的一般格式为:
cin>>变量1>>变量2>>……>>变量n;

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或’\n’,ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。

如下面这个代码段:

#include <iostream>
using namespace std;int main(){char *a = "message";a = "aoijgoiewjg";cout << a << endl;return 0;
}

输出的是:aoijgoiewjg。
因为cout获得“aoijgoiewjg”的首地址后,将a输出后,没有遇到‘\0’,所以能一直输出,直接遇到字符串末尾的’\0’才停止输出。

字符指针

  1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:”abc”,那么编译器帮你存储的是”abc\0”
  2. “abc”是常量吗?答案是有时是,有时不是。
    不是常量的情况:”abc”作为字符数组初始值的时候就不是,如
    char str[] = “abc”;
    因为定义的是一个字符数组,所以就相当于定义了一些空间来存放”abc”,而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为 char str[3] = {‘a’,’b’,’c’};又根据上面的总结1,所以char str[] = “abc”;的最终结果是 char str[4] = {‘a’,’b’,’c’,’\0’};
    做一下扩展,如果char str[] = “abc”;是在函数内部写的话,那么这里的”abc\0”因为不是常量,所以应该被放在栈上。
    是常量的情况: 把”abc”赋给一个字符指针变量时,如
    char* ptr = “abc”;
    因为定义的是一个普通指针,并没有定义空间来存放”abc”,所以编译器得帮我们找地方来放”abc”,显然,把这里的”abc”当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = ‘x’;也能编译通过,但是执行ptr[0] = ‘x’;就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。
    记得哪本书中曾经说过char* ptr = “abc”;这种写法原来在c++标准中是不允许的,但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,
    但是建议的写法应该是const char* ptr = “abc”;这样如果后面写ptr[0] = ‘x’的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。
    又扩展一下,如果char* ptr = “abc”;写在函数体内,那么虽然这里的”abc\0”被
    放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了。

所以下面这段代码在编译时没问题,在运行是就出问题了。

#include <iostream>
using namespace std;int main(){char *a = "message";a = "aoijgoiewjg";a[0] = 'b';//不能修改!!!cout << a << endl;return 0;
}

如果将 char *a 改成 const char *a 那么它会在编译时就报错!

注:字符数组和字符指针最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

C++——cout输出流与字符指针相关推荐

  1. 《C++程序设计教程(第3版)》——第3章,第2节cout输出流

    本节书摘来自华章出版社<C++程序设计教程(第3版)>一书中的第3章,第3.2节cout输出流,作者张志航,更多章节内容可以访问云栖社区"华章计算机"公众号查看 3.2 ...

  2. 2020-11-30(为什么字符串可以赋值给字符指针变量)

    今天带着疑问去看了看字符指针,就一直在想为什么输出一个指向字符的指针,它输出的不是地址,而是字符,结果挖到了一个宝藏博客,然后结合了自身的想法,摘抄了大部分内容,最后我也把我自己的疑问给解决了,外加再 ...

  3. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...

    指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...

  4. 共享内存中使用指针_详解c++中字符指针数组的使用

    之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用​zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...

  5. C++ char指针(字符指针)及其输出问题

    现在来介绍一下 字符指针,char 指针的声明方式与普通指针一致, 但有一些特殊的地方 char 指针可以看作是字符串, 比如说: const char *str="HelloWorld!& ...

  6. c语言 字符指针输出字符串,输出字符指针就是输出字符串

    本文收集整理关于输出字符指针就是输出字符串的相关议题,使用内容导航快速到达. 内容导航: Q1:C语言 如何用指针输出字符串中间的字符? #include"stdio.h" mai ...

  7. 字符指针,字符数组,双引号的字符串的区别与联系

    2019独角兽企业重金招聘Python工程师标准>>> 作者 :  陈宗权 先说说双引号的字符串,比如"chenzongquan",它是由里面咱们看到的一系列字符 ...

  8. C语言 —— 把字符指针中的字符串,存入字符数组中

    问题描述:有一个用字符指针表示的字符串char *str = "0 12";  有一个数组 char buf[128] = {0}; 现在需要将字符指针表示的字符串"0 ...

  9. [cpp] 字符数组,字符指针,sizeof,strlen总结

    对于字符数组与字符指针: 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0". ...

最新文章

  1. 构建超级智能未来系统的三原则
  2. 3.6.1 局域网的基本概念和体系结构
  3. JBPM4.4_jBPM4.4应用(与Spring集成自行控制事务等)
  4. 山西大学计算机科学与技术全国排名,山西这所大学曾是国内排名前五,如今排名下滑,有点走下坡路了...
  5. Jquery复习(一)之animate()易忘点
  6. python与excel的差别-python数据分析相对于bi和excel的优势是什么?
  7. 就是要让你搞懂 Nginx,这篇就够了!
  8. python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
  9. 最良心的 chrome 插件可以良心到什么程度?
  10. 视频通信基础知识之采集
  11. matlab两个曲线的名称怎么显示出来的,求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上?...
  12. Python 命令的参数
  13. 【Sql查询数据】for 日、月、年
  14. 明翰游戏学笔记V0.2(持续更新)
  15. STM32CubeIDE 使用技巧和说明
  16. 地籍测量类毕业论文文献有哪些?
  17. matplotlib.pyplot 绘制图中图
  18. 用只读打开服务器上的文档,打开WebDAV文档在MS Office中以IT只读方式打开WebDAV服务器...
  19. Android蓝牙手柄摇杆 十字按键监听手机focus焦点
  20. 恐怖的ChatGPT!

热门文章

  1. spring boot 日志乱码_3. Spring Boot日志
  2. python编程计算器_python怎么编写计算器程序
  3. java数组的用法_Java数组的使用
  4. pil对图像加透明 python_使用Python图像处理库Pillow处理图像文件
  5. IDEA自动勾选显示类型(specify type)
  6. vue Cli 环境删除与重装 - 版本文档
  7. vue项目+富文本编辑器ueditor - 资源篇
  8. Vue数据更新数据不渲染问题 - 资源篇
  9. svg标签的CSS3动画特效 - 经典特效2
  10. 源导航V1.0-集网址、资源、资讯于一体的导航系统