《好学的C++程序设计》——2.1 数据分类入驻存储空间听候处理

简介:

本节书摘来自异步社区出版社《好学的C++程序设计》一书中的第2章,第2.1节,作者: 张祖浩 , 沈天晴,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.1 数据分类入驻存储空间听候处理

好学的C++程序设计

2.1.1 基本数据分哪些类

我们平时所常用的基本数据类型有char(字符型)、int(整数型)、float(带小数点的数,称为实数型)、double(双精度带小数点的数,简称双精度型)。

其中,char型数据在计算机中实际就是以8位二进制码(ASCII码)所表示的一个整数。故从本质上说,char型也可看成是整数型。常用的字符见附录中ASCII码。字符可以对整型变量赋值。反过来,整数也可对字符类型变量赋值。二者是相通的。字符进行算术运算时,以其ASCII码值参与运算。

表2-1中,按数据有无正负,可修饰为signed(有正负)或unsigned(无正负,即全正);按数据的长度大小又可修饰为short(短)或long(长)。这些修饰词与基本数据类型组合后,综合而形成如表2-1所示的常用的各种基本数据类型。
image

照理,对每种数据类型都需作出定义后才可使用,但现在表中所示各种类型含义都已清楚而明确,因此就不必作出定义了。类型定义又称为类型声明。

表2-1中的各项具体数据对不同的C++系统有可能会有所区别。

2.1.2 什么是数据变量的存储空间、长度和取值范围

表2-1中谈到存储空间、长度和取值范围,现作具体说明如下。

变量存储空间及其大小、地址、类型、内容
一般而言,随着程序的运行,数据之值会有所变化,故称之为数据变量,简称变量。常量可以看做是变量的特殊情况。

用以存储变量值的内存空间叫做变量存储空间,简称存储空间。成串的存储空间连成一片,称为存储区。

存储空间是由连续的内存单元组成的,1个内存单元可存储1字节(即8位二进制数)。存储空间大小可用内存单元数(即字节数)来表示。拿int型变量来说,表2-1表明,int型存储空间占4个字节,即占4个内存单元,如图2.1所示。
image

从图2.1所示来看,存储空间所占的每个内存单元都有其地址,是连续编的,例如图中1326~1329。存储空间的第一个内存单元地址(即首字节地址,图中是1326)就定义为该存储空间的地址。如果存储空间中存储了某变量,则此地址也作为该变量的地址。

变量有类型,其存储空间也应该有类型。我们把变量的类型定义为其存储空间的类型。也就是说,变量存储空间的类型就是所存储变量的类型。比如,int型存储空间是存储int型变量的;char型存储空间是存储char型变量的……存储空间的类型与所存储变量的类型是一致的。

如果变量之值存入了存储空间,则存储空间内容就是该变量之值。否则,存储空间内容是一个随机值,说不定是多大多小。

存储空间中变量值怎么安置
数据变量值在存储空间中是怎样安置的呢?对整数而言,存储安置的规则是:变量值的高位字节存于高地址的内存单元中;低位字节存于低地址的内存单元中。

拿图2.1中情况来说,图中int型变量值、存储空间及其各字节情况如下:
image

比如,设一个int型变量的二进制值为:11011011011011010010011010100011,

以十六进制表示就是:DB6D26A3共占4个字节,4个字节中的数据分别为:DB、6D、26、A3。它们分别存储在4个内存单元中。按“高位字节存于高地址,低位字节存于低地址”的规则,安置如图2.2所示。

以上的安置规则对于所有整型变量都是适用的。对实型变量的安置较复杂,本书就不谈了。

image

存储空间的大小及检测
存储空间的大小用存储空间所占内存单元数(字节数)来表示。从表2-1中看出,存储空间的大小是视类型而定的。对不同的计算机系统,各类型数据的存储空间字节数有可能有差别,我们可以用存储空间字节数运算符sizeof来进行检测。用的形式是:

sizeof(类型名或表达式)

sizeof的值就是括弧中的数据类型存储空间的字节数。例子如下。

【例2-1】检测表2-1中各类型变量存储空间的字节数。程序如下:

#include<iostream>
using namespace std;
int main()
{
  cout<<"char类型存储空间的字节数是:"<<sizeof(char)<< '\n';
  cout<<"int类型存储空间的字节数是:"<<sizeof(int)<<'\n';
  cout<<"float类型存储空间的字节数是:"<<sizeof(float)<<'\n';
  cout<<"double类型存储空间的字节数是:"<<sizeof(double)<<'\n';
  return 0;
}

程序运行结果输出如下:

char类型存储空间的字节数是:1
int类型存储空间的字节数是:4
float类型存储空间的字节数是:4
double类型存储空间的字节数是:8

程序中,共有4个输出语句,形式都相同。每一句都是先输出双引号中的字串,接着输出sizeof之值,即变量类型存储空间的字节数。各语句最后的'n'是换行的意思。

数据变量的长度和取值范围
一个字节是8位二进制数。一个变量存储空间的字节数乘以8就是该变量值的二进制总位数,这叫作该变量的长度。变量长度定下了,变量取值范围也定了,具体见表2-1中最右列。

程序运行中,如果某变量的运算超出其取值范围,则会产生溢出错误,这要引起注意。

2.1.3 数据常量怎样表示
代数式y=x+5中,x和y是变量,5是常量。C++中根据数据常量的不同类型采用不同的表示法,今分述如下:

整数常量的表示
(1)十进制整数的表示:这和我们平时所熟悉的形式一样,不必多谈。

(2)十六进制整数的表示:以0x或0X开头(其中0不是字母而是数字零),后跟着由0~F组合而成的整数,这是十六进制数的表示。例如0x5c就表示十六进制数5c。

实数常量的表示
实数是带小数点的数,其有效值默认是6位。表示形式有下列两种:

(1)一般形式:例如,14.8、−23.98,这和我们平时所熟悉的形式一样。

(2)科学记数法(又叫指数形式):例如,0.75×109表示为0.75E+9,−28.6×10−9表示为−28.6E−9。若小数点前留1位,则是标准科学记数法。例如前面二数分别表示为7.5E+8和−2.86E−8就是标准的科学记数。E大写小写都行,但E前E后都必须有数字。像E-5或0.67E这样表示都是非法的。

(3)后缀F或f的实数为float型。例如34.56f和67.45F。无后缀的实数默认为double型。例如34.56和67.45就默认为double型。

字符常量的表示
(1)对于可以通过键盘输入的,可显示的字符,可用单引号界定表示。例如‘A’、‘#’和‘?’等。

(2)对于不可以通过键盘输入的,不可显示的字符,C++提供了一种叫做转义序列的表示方法,常用的见表2-2。它是用反斜杠 将一个字符的含义作了转变,故称转义。

image

平时‘n’、‘t’、‘0’三者含义分别是字符n、t、0。如果三者各加入一个反斜杠成为‘n’、‘t’、‘0’,则含义就转变了。转义成特定含义,见表中1~3行含义列中所示。

平时反斜杠、单引号’、双引号”三者各有其特定含义,分别用于转义、字符界定、字符串界定。若想把它们单纯作为字符用而写成‘’、‘’’、‘”’,那是不够的,因为其特定含义并未改变。必须加入反斜杠进行转义,写成‘’、‘’’、‘”’。这样写就不按其特定含义,而是转义分别作为字符、字符’、字符”使用,见表中4~6行含义列中所示。

字符串常量的表示
字符串常量是用双引号界定的不可改变的字符序列。例如下面的几个:

"boy" "a" "1358"

存储时,每条字符串结尾处都要加一个结尾符‘0’以表示字符串结束。结尾符‘0’是ASCII码为零的字符NULL。

字符串和结尾符一起,存储于字符存储空间串中。所占内存单元总数应该是字符个数加1。

单个字符和上述字符串们在内存中的存储情况如图2.3所示。图中‘a’是单引号界定的,是单个字符;“a”是双引号界定的,是字符串。二者在存储方面的区别在于前者只占一个内存单元,而后者则因为额外加了一个字符串结尾符,故占两个内存单元。
image

由于平时双引号是作为字符串界定符使用的。若在字符串内有双引号作为字符串成员,则为避免误会就必须加反斜杠,以对其特定含义进行转义。例如对于下面的字符串:

Please enter "Yes"or"No".       //A

应表示为:

"Please enter \"Yes\"or\"No\"."    //B

由于平时反斜杠是作为转义的意思使用的。如果在字符串内有反斜杠作为字符串成员,则必须加反斜杠,以对其特定含义进行转义。例如对于表示文件路径的字符串:

D:\ex\G02.DOC                //C

应表示为:

"D:\\ex\\G02.DOC"              //D

以上说的是在程序中,若要表示A行或C行的字符串,则必须分别用B行或D行的形式表示之。但是,如果是从键盘输入A行或C行的字符串,则所有字符一律平等,均照原样按键就行,不必加转义的反斜杠。

在程序中,中文常以字符串形式出现。例如“请输入同学姓名。”,一个中文字的代码占用两个内存单元,中文标点符号亦然。字符串结尾符则和上述一样,也是‘0’或0,只占一个内存单元。因此字符串“请输入同学姓名。”连同字符串结尾符在内,总共占17个内存单元,也就是17个字节。这可用语句cout<

字符串常量的值
字符串常量的存储是由系统配给相应的字符存储空间串,将字符们连同结尾符依次存入各个存储空间中。把该字符串的首字符地址作为该字符串常量的值。

2.1.4 数据变量首次出场必须声明属何类型

程序中,凡某数据变量首次出场,都应该作一个声明,表明该变量属何类型。系统就根据该变量类型,配给相应存储空间,用以存储该变量之值。然后才能对该变量进行操作使用。

变量声明的一般形式如下:

数据类型 变量名1,变量名2,…,变量名n;
例如,下列两条语句声明了int 型变量n和total;float 型变量vol、r和hig。

int n,total;
float vol,r,hig;

句末的分号表示语句的结束。在同一条语句中声明多个变量时,相互间要用逗号隔开。

在声明变量的同时,也可以用“=”给变量设置初值(又叫做初始化)。例如:

int a=5; 
double b=3.45; 
char c=‘g’;

a初值为5,b初值为3.45,c初值为‘g’。声明语句中,用“=”进行初始化。

若不在声明的同时进行初始化,而在声明过后另赋初值也行。例如:

double b; 
char c; 
b=3.45;
c=‘g’;

每一条语句都用分号结束。前两条语句是变量声明语句。后两条语句都是赋值语句,赋值语句中“=”是赋值运算符,作赋值用。

注意,在程序内,“=”在声明语句中作初始化用,在赋值语句中作赋值运算符用。在程序之外的数学等式中“=”是作等号用。不同场合有不同含义,注意不要混淆。

2.1.5 怎样对数据变量进行访问

对变量进行访问就是对变量存储空间内容进行“读”或“写”
我们知道,数据是程序处理的对象。要对数据进行处理,就必然要对数据进行访问。所谓对数据进行访问,实际就是对数据变量存储空间进行赋值或取值。

赋值就是去原值存新值。赋值就好比是将原值覆盖掉,写上新值。取值不是像取苹果或取钱那样取一个少一个的。取值实际上是读值。存储空间中的值是万读不变的。

所以,简言之,所谓对变量进行访问,实际就是对变量存储空间内容进行“读”或“写”。

“直呼其名”访问、直呼别名访问、循址访问
“直呼其名”访问就是用变量名,对变量进行访问。这是访问变量的一种基本方式。例如,在第1章例1-1中有一语句“dif=a-b;”。此句赋值运算符“=”的右侧a-b的意思是从变量a和变量b的存储空间中读出二者之值,求出二者之差a-b。然后,通过赋值运算符“=”将二者之差a-b赋给左侧的变量dif。这样,dif存储空间中的值就是a-b了。这就是用各变量之名对各变量进行读值或写值。是“直呼其名”的访问。这种访问较简单,不多谈。

变量还可以另取一个别名,可用别名进行访问。这和“直呼其名”一样,不过是“直呼其别名”而已。

我们知道,变量存储空间是有地址的。因此,要对变量进行访问还可以采用循址访问的方式进行访问。变量地址又叫指针,即用指针进行访问。

下面将对别名和指针分别进行介绍。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
9月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
207 2
|
10月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
409 35
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
463 12
|
12月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
241 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
316 5
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
145 6
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
317 2
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
191 5
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
110 1
|
存储 数据格式 运维
开发与运维C++问题之更改数据模型为通用数据结构如何解决
开发与运维C++问题之更改数据模型为通用数据结构如何解决
134 1