复合类型与函数

指针和引用
内存地址
程序运行时,代码和需要的数据都被存储在内存中。内存是有序的字节序列,每个字节都有唯一的地址,使用该地址可以确定字节的位置用以获取和存储数据。
直接访问和间接访问
通过变量的名字直接访问为程序中变量的名字分配的内存单元,获取变量的值
使用变量的内存地址找到存放数据的单元,间接访问其中的内容
指针的特点
指针持有一个对象的地址,称为指针指向该对象,通过指针可以间接操纵他指向的对象
定义指针变量的语法
每个指针都有相关的类型要在定义指针时指出。
类型*指针变量
指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&”
如果指针指向一个对象,则可以通过指针间接访问该对象,使用指针解引用运算符“*”。
指向一个对象的指针有两个存储单元与之相关。
指针的类型即指针指向的类型,每个指针都有相关的类型,需要在定义指针时指出。type*pointer
指针不能保存非地址值,也不能被赋值或初始化为不同类型的地址值。
指针的值为零时是一个空指针,不指向任何对象。
定义指针时,应对指针进行初始化
指针的运算
同类型的指针可以进行相等或不想等的比较操作,比较的结果是布尔类型。
指针可以进行加或减整数值的算术运算
自增自减运算符适用于指向数组元素的指针
void*指针为通用指针,相关的值是个地址,但是该地址保存的对象类型不知道。
不能操纵void指针指向的对象,只能传送该地址值或者和其他地址值比较
不允许void指针到其他类型指针的直接赋值。
指针的典型用法包括构建链式的数据结构,如链表和树;管理程序运行时的动态分配的对象,作为函数的参数。
存储空间分配策略
静态  动态
静态由编译器自动处理,动态由程序员处理
动态存储空间管理
堆,自由存储区,动态存储区
new运算符
在堆上动态分配空间,创建对象,并反回对象的地址,一般将new返回的地址保存在指针变量中,以便间接访问堆上的对象。
new表达式的三种形式
分配单个对象:new类型或者new类型初始值
分配多个连续存储的对象:new类型(数组大小)
定位new,在指定位置分配空间。
不能对数组进行显式的初始化
数组大小不必是常量,是数组元素的个数,不是字节数
用new分配数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针
new指针类型:定位new在指针指向的空间中创建一个指定类型的对象
程序员可以预先分配大量的内存,以后通过定位new表达式在这段内存中创建对象
使用定位new,必须包含标准库头文件<new>
堆上的空间在使用后必须释放,否则会造成内存泄露。
new运算符分配的空间用delete运算符释放
执行delete运算后指针IP指向的空间被释放,不能再使用ip指向的内存,但是ip这个指针变量自己的存储空间不受影响
delete后的ip不是空指针,而是空悬指针,即指向不确定的单元
delete之后,继续通过ip间接使用这个单元是非法的,会引起不可预料的错误
引用和左值引用
通过左值引用可以间接地操纵对象
在程序中,引用主要用作函数的参数
引用的定义和初始化
引用由类型标识符和一个取地址符来定义
引用必须被初始化,初始值是一个有内存地址的对象。
一般在初始化变量时,初始值会被复制到新建的对象中
定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。
一旦初始化完成,引用将和它的初始值对象一直绑定在一起
因为无法令引用重新绑定到另外一个对象,所以引用必须初始化。
引用一旦初始化,就不能再指向其他的对象,对左值引用的所有操作都会被应用在它所指向的对象上
初始化时引用绑定到一个对象
赋值时引用被作为所绑定对象的别名
引用并非对象,是为已存在的对象所起的另一个名字。
引用只能去绑定到对象上,不能与字面值或某个表达式的计算结果绑定在一起
引用本身不是对象,所以不能定义引用的指针。
std::move
关键字const限定对象是不可改变的
关键字volatile限定的对象不能被编译器例行优化。
当一个对象的值可能在编译器的控制或检测之外被改变时,可以将对象声明为volatile
const限定指针
const type*cp或者type const*cp;cp是指向常量的指针,它所指向的内存中的内容是不可以改变的
const引用可以绑定到const对象
不能用非const引用指向const对象
const引用不能用来修改它所绑定的对象
可以用任意表达式初始化const引用
结构体和枚举结构体把一组来自不同类型的数据组合在一起构成复合类型,其中的每个数据都是结构体的成员。
结构体由关键字struct定义
结构体变量的成员在内存中按声明的顺序依次存放
枚举类型定义了一组命名的整数常量,以提高代码的可读性
可以指定枚举成员的值
可以使用未命名的枚举类型定义常量
枚举类型在必要时会被自动提升为算数类型
使用数组时一般会转换为指针,可以使用指针对数组进行访问当使用数组名作为一个auto变量的初始值时,得到的类型是指针而不是数组
一堆数组元素在内存中按下标顺序依次存放
多维数组在内存中按行序存储
使用指针访问数组时需要控制指针的范围,确保指针指向数组的元素
 being返回指向数组第一个元素的指针
end返回指向数组最后一个元素的下一个位置的指针
指向数组的指针可以执行解引用,自增自减,加或减一个整数,两个指针相减比较等运算
string表示可变长度的字符序列
string类支持字符串对象的各种操作
使用string类要包含头文件<string>
使用标准库中iostream可以读写string对象
可以用循环读取未知数量的string对象
getline
empty
size
可以用关系运算符比较两个字符串对象
允许把一个string对象的值赋给另一个string对象
也可以为string对象赋一个字符串字面值常量
两个字符串可以直接用+连接,结果得到一个新的string对象
使用下标运算符可以获取string对象中指定位置的字符
vector的特点
表示对象的集合,其中所有对象的类型都相同,可以通过索引访问各个对象
vector是对象,其中容纳这着其他对象,被称为容器。
下标运算符只能访问已经存在的元素,使用下标运算符可以获取vector中指定位置的元素
用下标访问vector中的元素要确保下标的合理范围
下标运算符不改变vector对象的大小
访问标准容器的元素的通用方法是使用迭代器
迭代器类似于指针类型,提供对对象的间接访问
字符串流的用途
从输入流一次性读取一大块数据,以字符串形式保存在istringstream对象中,再用适当的输入操作逐项从istringstream对象中提取各个数据项
函数是一个命名的代码块,通过调用函数可以执行相应的代码
用来实现相应的各种算法,完成特定的任务
库函数,程序员自定义的函数
函数的参数列表不能省略
如果函数没有任何参数,可以用空参数表或void参数表表示
函数必须指定一个返回类型,如果函数不返回任何结果,将其返回类型声明为void
函数调用时完成两项工作,一是用实参初始化函数对应的形参,二是将控制权转移给被调用的函数
遇到return语句时,结束函数的执行,return语句的作用,一是返回return语句中的值,二是将控制权从被调用函数转移回主调函数。
函数在使用之前必须声明
一个函数可以在程序中多次声明
函数定义也可以被用作声明,但是函数在程序中只能定义一次。
参数传递是指用函数调用的实参来初始化函数形参存储区的过程
形参的类型决定了实参初始化形参的方式。
按值传递:把实参的值复制到形参的存储区中,即用实参值初始化形参。
函数调用会使程序的控制权传递给被调函数,而当前活动函数的执行被挂起
当被调函数执行完成时,主调函数从调用语句之后的语句恢复执行
函数在执行完函数体的最后一条语句或遇到return语句时返回
默认情况下,函数的返回值是按值传递的,简单直接,不会改变实参的内容
参数传递方式的选择
对于内置类型的小对象,传值的方式更简单直接
如果想在函数内改变实参,使用传引用或传指针的方式
对于类类型的对象,尽量使用引用传递参数,效率更高
数组和函数作参数时必须传指针
拷贝够造函数的参数必须传引用
数组作参数时,将传递数组第一个元素的地址
return语句结束当前正在执行的函数,将控制权返回给函数的调用者
非void的函数必须返回一个与声明类型匹配的值,否则会引起编译错误
函数返回的引用仅是它所指向对象的一个别名
调用一个返回引用的函数得到左值其他返回类型得到右值
函数执行结束后,函数占用的栈存储空间被释放,原本位于这段存储空间中的局部对象和临时对象都被释放,返回的局部对象引用或指针将指向不在有效的内存区域
如果列表为空,临时量执行初始化
多个函数可以共享同一个函数名,针对不同的参数类型提供不同的操作。如果同一个作用域内的几个函数名字相同但形参列表不同,则他们是重载函数。
函数的其他课本知识不再赘述,总之这部分内容难度很高,需要多加巩固练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值