由于初学者对这两个概念总是有点蒙查查,所以特意在新的教材写了这一节内容。

1.数据缓冲区

我们知道,当用户通过键盘输入数据时,scanf函数只有检测到'\n'符,计算机才认为用户数据输入完毕。而包括回车符在内的数据总得有个落脚点吧!当然,聪明的计算机设计大师绝不会让用户输入的有价值的数据无缘无故地消失掉,他们早已考虑了这些细节问题,事先为这些数据的去处作了充分周密的安排。

与极速运行的CPU相比,数据的输入/输出和键盘的I/O接口是一个极其缓慢的外设。为了减少CPU的等待时间,因此在内存中开辟了一个叫做“缓冲区”的存储单元,用于保存输入或输出数据。“缓冲区”其实相当于一个仓库,其示意图详见图 4.2(略)。

打一个比方,“通过键盘输入数据”好比正在生产产品的工厂,“缓冲区”就像仓库,用于放置已经生产出来的产品,而“读取数据”则好比卖东西的门市部。我们想一想,如果没有仓库,则工厂生产出来的产品就没地方放置,必须生产一个产品,门市部再去取一个产品,然后再生产再取,如果生产10个产品就得来回跑10趟,这样岂不是很浪费资源?于是就有了仓库,工厂不再需要直接和门市部打交道,它只需要将生产好的产品放到仓库就行,而门市部也不需要立即去处理已经生产的产品,当要用的时候再去仓库取就好了。

由此可见,从键盘输入数据存放到缓冲区,即相当于工厂将生产好的产品放到仓库中。而从缓冲区读取数据,即相当于从仓库取走产品。

当scanf函数检测到'\n'符时,则立即从缓冲区中取走输入数据赋值给变量,但却不会取走对用户来说无效的'\n'符。虽然'\n'符用作输入数据结束的标志符,但也可作为每一行源代码结束的标志符。

此时,即使用户第二次执行读取数据操作,而计算机则会直接跳过去,因为缓冲区内只有'\n'符。其实这些可能的不合情理的操作,计算机设计大师犹如神机妙算早已料到,每次都会让计算机检测缓冲区是非为空,只有缓冲区不空时,才允许执行读取数据操作。

2. 变量的地址

虽然“缓冲区”这个名字对于初学者来说是第一次接触,但实际上它仅仅是一个“中转站”而已,因此也不需要知道保存这些数据的存储单元地址。而变量则不一样,它在内存中必须具有确定的位置,否则无法一直保存以备再次使用。那么到底如何获得变量的地址呢?C语言用“&num(&地址运算符加变量名)”的方式获得变量的地址。比如:

int num = 1;

定义了一个整型值变量num并初始化为1。

通过前面的学习,我们知道,num是变量名,变量num的值为1,那么保存数值1的变量的地址就是“&num”。也就是说,从缓冲区读取的数据赋值给变量保存在“&num”存储单元中。

而事实上,几乎所有的C 程序都包含输入输出,因此输入输出是程序中最基本的操作之一。从程序清单 2.2开始可以看到,输入并读取整数的操作为

scanf("%d",&num);

即就是将从键盘输入的数据存放到缓冲区,当检测到'\n'符时,则立即从缓冲区读取数据赋值给变量num。

3.输入函数格式

用scanf函数输入数据的一般形式如下:

scanf(格式控制,地址表列);

“格式控制”与printf函数完全相同,它同样包括“格式声明和普通字符”信息。而“地址表列”则是由若干个地址所组成的表列,因此既可为变量的地址,也可为字符串的首地址。

......

计算机变量与变量地址,数据缓冲区与变量的地址(更新1)相关推荐

  1. 演练 使用变量存储商品的数据 0126

    演练 使用变量存储商品的数据 0126 使用变量存储以下MP3信息,并打印输出 品牌(brand):爱国者F928 重量(weight):12.4 电池类型(type):内置锂电池 价格(price) ...

  2. python不允许使用关键字作为变量名_python函数变量_python不允许使用关键字作为变量名,允许使用内置函数名作为变量名,但这会改变函数 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在python 中, ...

  3. wireshark抓组播数据_捕获广播或多播地址数据MAC地址数据端口应用程序数据Wireshark网络分析实例集锦大学霸...

    捕获广播或多播地址数据MAC地址数据端口应用程序数据Wireshark网络分析实例集锦大学霸 Wireshark网络分析实例集锦大学霸 3.8.3  捕获广播或多播地址数据广播地址就是当IP地址的网络 ...

  4. 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...

    2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...

  5. c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...

    7.7 变量的存储类别.作用域及生存期 1.变量的存储类别 在C语言中,有两类存储类别:自动类别及静态类别. 有4个与两种存储类别有关的说明符:auto(自动).register(寄存器).stati ...

  6. linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...

    转自:http://blog.csdn.net/gongweijiao/article/details/8207333 原文参见:http://blog.163.com/xychenbaihu@yea ...

  7. java数据段 静态区_linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...

    一)概述 .堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储. .堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说 ...

  8. 【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

    上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:[软件开发底层知识修炼]十五 快速学习GDB调试二 使用GDB进行断点调试 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测 ...

  9. c语言函数变量地址符,C语言中取地址符做函数形参?—— 引用的讨论

    取地址符&做函数形参? C语言强大且危险 引入 这个问题花去了整整一天的研究. 先看一段严蔚敏的<数据结构>中栈的例程: 这里面的&S第一遍看的时候想当然的认为是取了SqS ...

  10. 【Python】Python基本概念、print()输出函数、标准数据类型、type()函数与isinstance()函数、数据类型转换、变量与变量名的命名规则、注释

    1.Python基本概念 1.编译器&解释器 : 将代码编译成计算机能够识别的命令 计算机可以识别的机器码 0 1 区别: 编译器:全文翻译,编译型语言 解释器:实时翻译,解释型语言 2.py ...

最新文章

  1. CIKM 2021 | 基于IPCA的多属性分子优化
  2. windowsphone开发_[app开发定制公司]开发app需要什么技术呢?
  3. JetBrains 第二轮:再为免费全家桶续命三个月
  4. 分分钟入门【Nodejs】—一个网页是如何生成的
  5. SwipeBackActivity 的使用
  6. 【炼丹技巧】指数移动平均(EMA)【在一定程度上提高最终模型在测试数据上的表现(例如accuracy、FID、泛化能力...)】
  7. 理解Java对象序列化——Serializable接口
  8. Linux学习总结(52)——主流 Linux 发行版性能对比
  9. java lazy_Java AtomicLong lazySet()用法及代码示例
  10. windows类书的学习心得
  11. sqlalchemy 8 会话 与 异常
  12. 每周读书#14 - 彷徨之刃
  13. java里异常名词解释_java名词解释
  14. unity GC机制简单介绍
  15. RealSense相机在ros2环境的安装
  16. EF系列(二)——DbContext 和DbSet
  17. Spring Security + JWT实现权限管理
  18. 还在手动部署 Kubernetes 集群吗,是时候使用 Kubespray 完成自动化部署了!
  19. 漂亮国站-亚马逊跨境电商平台新规定
  20. 干货:英语四级阅读理解技巧

热门文章

  1. 程序员该怎么学习---弱水三千,只取一瓢
  2. CentOS-8 dnf 前端工具学习笔记
  3. 计算机休眠和睡眠省电,笔记本电脑的睡眠方式和休眠方式那个省电
  4. 单片机C语言关键字之extern
  5. Pygame 入门基本指南
  6. HTML入门(学习方法+概述)
  7. 新浪云python开发_Python开发入门与实战17-新浪云部署
  8. 达梦新起点:达梦DM8化繁为简 助力数据库发展新方向
  9. RecyclerView添加分割线
  10. linux 验证码 权限,linux 上验证码无法显示