C++程序设计基础【五】(引用和指针)

一、引用

引用是对象的替代名称,以简化实体之间的通信。当声明一个引用变量时,不会在内存中创建一个新的对象,而只是声明一个现有变量的替代名称

int& rScore = score;//声明类型为int&的引用变量B,并将其绑定到A上

引用变量在原始变量前加上r并将首字母大写,形成约定,方便查看绑定的对象

1.规范

1.复合类型

引用类型是复合类型,但不能用double&的引用变量来引用int类型的变量

2.永久绑定

引用关系一旦建立后,就不能被更改

3.多重性

可以将多个引用变量绑定到同一个变量,不能将一个引用变量绑定到多个变量

4.不能绑定到值

2.检索值

3.修改值

可以通过原始变量或者任何引用变量修改该值,除非使用const修饰符

4.引用的应用

两个变量使用相同的内存位置,当两个变量处于不同的作用域时使用引用

1.按引用传递

主调函数需要将一个(或多个)对象传递给被调用函数进行处理
按值传递有两个问题,一是形参改变不影响实参,一是复制成本高
(1)如果需要防止更改操作,则应该:(a)对于小对象,使用按值传递;(b)对于大对象,使用按常量引用或按常量指针传递。
(2)如果需要进行更改操作,则应该使用按引用传递或者按指针传递
不能把引用的形式参数绑定到实际参数值

2.按引用返回

被调用函数具有必须返回到主调函数的对象
按值返回存在复制成本高的问题
按引用返回的对象不能是值参数或者局部变量(静态变量除外)

二、指针

指针类型是表示内存位置地址的复合类型,其字面量值是地址,指针变量是其内容为指针类型的变量

1.地址

变量的地址是该变量所占用的第一个字节的地址

2.指针类型和指针变量

为了创建指向某个类型的指针,我们将星号(*)添加到类型名称后面

1.指针变量

存储在指针变量中的是一个4字节的地址

1.声明

bool* pFlag;

从右向左读取声明(pFlag是一个指针,指向bool类型)

2.初始化

指针变量必须用内存中的有效地址初始化

bool* pFlag = &flag;

3.间接引用(解引用)

在主调函数中使用直接方法,在相应的被调用函数中使用间接方法

*pFlag;

4.两个相关的运算符

地址运算符&用于取地址,接收一个变量并返回其地址
间接运算符*用于间接访问,接收一个地址并返回相应的被指变量的值

3.使用const修饰值更改指针

如果指针关系为常量,则无法中断其关系并使指针指向另一个数据变量,此时const修饰符必须放在指针变量的名称前面

4.指向指针的指针

指向指针的指针用双星号(**)

5.两种特殊的指针

1.不指向任何对象的指针(null指针)

不指向任何内存位置的指针,绑定到字面量0,在绑定到有效地址之前无法使用

int* p1 = 0;
double* p2 = 0;

2.指向void的指针(void指针)

void指针是一个通用指针,可以指向任何类型的对象,但在转换为适当的类型前无法引用

6.指针的应用

1.按指针传递

按指针传递的复制成本是固定的4字节地址成本
与按引用传递不同,没有共享形参和实参

2.按指针返回

被调用函数具有必须返回到主调函数的对象

三、数组与指针

1.一维数组

数组的名称是指向第一个元素的常量指针
当使用指针引用数组元素时,需要使用括号来优先计算加法运算符

1.指针的算术运算

指针可进行有限的算术运算
指针减指针得到一个整数
两个指针不能相加

2,带数组参数的函数

形参可用int* p代替array[]传递

2.二维数组和指针

C++中的二维数组是数组的数组
用int(*)[列数]代替数组传递

四、内存管理

C++程序运行时,会使用内存位置

1.代码内存

代码内存存储程序代码,当程序终止时释放其占用的内存

2.静态内存

静态内存用于保存全局对象和静态对象,当程序终止时释放其占用的内存

3.栈内存

栈内存是程序用来保存函数的局部对象或者参数对象的内存部分
在栈内存中创建的对象在编译期间必须具有名称和大小

4.堆内存

在堆内存中创建的对象不能有名称,只能通过其地址访问它,该地址由栈内存中的指针访问

1.new和delete

1.分配对象:new type

2.分配数组:new type [size]

3.释放对象:delete ptr

4.释放数组:delete [] ptr

2.有关堆内存的问题

1.释放没有分配的内存

没有new就不能delete

2.分配了内存但没有释放(内存泄漏)

new了但没有delete

3.悬空指针

delete后再使用时会报错

5.二维数组

1.仅使用栈内存

编译前数组的行列均已知

2.同时使用栈内存和堆内存

编译前数组的行已知,列未知

3.仅使用堆内存

编译前数组的行列均未知

猜你喜欢

转载自blog.csdn.net/qq_37249793/article/details/131026259