《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))。
相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
37 3
|
22天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
26天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
26天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
26天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
4天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
21 0
|
29天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
48 2
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。