《c++语言导学》——1.8 指针、数组和引用

简介:

本节书摘来自华章计算机《c++语言导学》一书中的第1章,第1.8节,[美] 本贾尼·斯特劳斯特卢普 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.8 指针、数组和引用

元素类型为char的数组可以声明如下:


e8834940f2803373f1703509102a82c752176c40

类似地,指针可以声明如下:

<a href=https://yqfile.alicdn.com/cb1c2e165d6d5afd2397d5481f7754f1ecc1094c.png
" >

在声明语句中,[ ]表示“……的数组”,*表示“指向……”。所有数组的下标都从0开始,因此v包含6个元素:v[0]到v[5]。数组的大小必须是一个常量表达式(见1.7节)。指针变量中存放着一个指定类型对象的地址:

4b9cb958532798fa16316f428415b956e1ecded3

在表达式中,前置一元运算符*表示“……的内容”,而前置一元运算符&表示“……的地址”。可以用下面的图形来表示上述初始化定义的结果:

<a href=https://yqfile.alicdn.com/86b6db9aa20349861e511600f4defe900834b2d7.png
" >

考虑将一个数组的10个元素拷贝给另一个数组的任务:

<a href=https://yqfile.alicdn.com/b188c8f450d33bb47a8a1700b036098475904cb3.png
" >

上面的for语句可以这样解读:将i置为0,当i不等于10时,拷贝第i个元素并递增i。当作用于一个整型变量时,递增运算符++执行简单的加1操作。C++还提供了一种更简单的for语句,即范围for(range-for)语句,它可以用最简单的方式遍历一个序列:

<a href=https://yqfile.alicdn.com/c2a547f976a322ad625d5ca9f5854e008bf2e2d6.png
" >

上面的第一个范围for语句可以解读为“对于v的每个元素,将其从头到尾依次拷入x并打印”。注意,当我们使用一个列表初始化数组时无需指定其大小。范围for语句可用于任意的元素序列(见10.1节)。
如果我们不希望把v的值拷贝到变量x中,而只是令x引用一个元素,则可以编写如下的代码:

bcb0508131311d0f905f89a7351b2923d79777f1

在声明语句中,一元后置运算符&表示“……的引用”。引用类似于指针,唯一的区别是我们无需使用前置运算符*访问所引用的值。同样,一个引用在初始化之后就不能再引用其他对象了。
当我们指定函数的参数类型时,引用特别有用。例如:

8566f40ab1e7680b73dae452da5b082b57128eb3

通过把参数类型定义成引用,我们在调用sort(my_vec)函数时就不必把实参拷贝给形参,而是直接在my_vec上执行操作,对它排序。
还有一种情况,我们既不想修改实参的内容,又希望节省参数拷贝的代价,此时可以使用const引用。例如:

0cf8477cd2aecf87bfc0a0a0928aa45c349869af

函数使用const引用类型的参数是一个非常普遍的现象。
当用于声明语句时,运算符(如&、*和[])称为声明运算符(declarator operator):

de4995d867f108c4695482d30774ad5b47b437d6

我们的目标是确保指针永远指向某个对象,这样解引用该指针的操作就是合法的。当确实没有对象可指或者希望表达一种“没有可用对象”的含义时(比如在列表的末尾),我们令指针取值为nullptr(“空指针”)。所有指针类型都共享同一个nullptr:

35334ff85394ce0f39db939028bc8a11a3ae8ddf

通常情况下,当我们希望指针实参指向某个东西时,最好检查一下是否确实如此:

5de08ab3170dcef220bdfc7494ed4fc39185119c

有两点值得注意:一是我们可以使用++把指针移动到数组的下一个元素;二是在for语句中如果我们不需要初始化操作,则可以省略它。
count_x()的定义假定char*是一个C风格字符串(C-style string),也就是说指针指向了一个字符数组,该数组的结尾处是0。
在旧式代码中,0和NULL都可以用来替代nullptr的功能。不过,使用nullptr能够避免混淆整数(如0或NULL)和指针(如nullptr)。
例子中用到的count_x()函数不必太复杂,我们只需对nullptr稍做检查即可。因为在上面的代码中for语句并没有执行初始化的部分,所以不妨把它改成更简单的while语句:

<a href=https://yqfile.alicdn.com/8d22d78508b957ca4ebe05197605680536bbedd4.png" >

while语句不断重复执行,直到它的条件部分变成false为止。
直接把指针作为条件检验(如while(p))的效果等同于比较该指针与空指针是否相等(如while(p!=nullptr))。
相关文章
|
9天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
5天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
3天前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
|
3天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
4天前
|
Java Go 区块链
【Go语言专栏】Go语言中的指针与内存管理
【4月更文挑战第30天】Go语言,由Google开发,是一种静态强类型、编译型、并发型语言,具有垃圾回收功能,常用于云计算、微服务、区块链等领域。本文聚焦Go中的指针和内存管理。指针表示变量内存地址,可用于直接访问和修改变量,如示例代码所示。指针运算有限制,仅支持相同类型变量和数组元素访问。内存管理由Go运行时的垃圾回收机制处理,自动回收无引用对象,简化管理但引入性能开销。可通过`runtime.GC()`手动触发垃圾回收。
|
5天前
|
Linux 程序员 图形学
C++语言在现代软件开发中的应用与实践
C++语言在现代软件开发中的应用与实践
12 2
|
5天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用
|
5天前
|
存储 程序员 C语言
深入理解C++:从语言特性到实践应用
深入理解C++:从语言特性到实践应用
16 3
|
5天前
|
存储 算法 安全
C++语言深度探索:从基础到实践
C++语言深度探索:从基础到实践
10 2
|
6天前
|
Go
一文带你速通go语言指针
一文带你速通go语言指针
13 0