C++学习之指针和引用

指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

 在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。

C++ Null 指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为指针。NULL 指针是一个定义在标准库中的值为零的常量。

C++ 指针的算术运算

C++ 指针的算术运算 | 菜鸟教程

可以对指针进行四种算术运算:++、--、+、-。

指针的自加和自减运算,实际就是进行地址偏移,每次偏移的量是指针所代码的数据结构/数据类型长度。加法和减法一样的,就是地址的偏移。

指针算术运算的详细解析:

  • 加法运算:可以对指针进行加法运算。当一个指针p加上一个整数n时,结果是指针p向前移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p + 1将指向p所指向的下一个int元素。

  • 减法运算:可以对指针进行减法运算。当一个指针p减去一个整数n时,结果是指针p向后移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p - 1将指向p所指向的前一个int元素。

  • 指针与指针之间的减法运算:可以计算两个指针之间的距离。当从一个指针p减去另一个指针q时,结果是两个指针之间的元素个数。例如,如果p和q是两个int类型的指针,每个int占4个字节,那么p - q将得到两个指针之间的元素个数。

  • 指针与整数之间的比较运算:可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。

C++ 指向指针的指针

C++ 指向指针的指针(多级间接寻址) | 菜鸟教程

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。

指针的指针就是将指针的地址存放在另一个指针里面。

通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

C++ 引用

C++ 引用 | 菜鸟教程

在C++中,引用是一个已存在变量的别名,也就是说,引用和它所引用的变量共享同一块内存地址。一旦一个引用被初始化为一个对象,就不能再引用另一个对象。引用必须在声明的时候就被初始化。

在函数参数中使用引用可以避免数据的拷贝,提高效率,并允许函数修改调用者的数据。

在C++中,引用经常与常量一起使用,以创建一个指向常量的引用,或者一个常量引用,这意味着不能通过引用修改它所引用的变量的值。

引用是C++中一个强大的工具,可以用来提高代码的效率,减少数据拷贝,并在函数间传递大型对象时提供便利。但使用时需要小心,确保不要违反引用的基本规则,比如引用必须在声明时初始化,以及不能改变一个引用所引用的对象。

C++的指针和引用有什么区别?

C++中的指针和引用在许多方面是相似的,但在使用上却存在显著的区别。以下是它们之间的主要差异:

  1. 定义与初始化:指针是一个变量,其值为另一个变量的地址。指针在使用前必须初始化,否则指向的是不确定的内存位置,这可能导致程序错误。而引用则是另一个变量的别名,必须在声明时初始化,一旦初始化后就不能再指向其他变量。
  2. 内存分配:指针本身是一个对象,占用内存空间(存储的是它所指向对象的地址),而引用不占用额外的内存空间,它只是其绑定对象的一个别名。
  3. 可空性:指针可以为空(NULL或nullptr),而引用则不可以为空。引用必须总是指向某个对象。
  4. 修改性:指针的值(即它所指向的地址)可以在任何时候被改变以指向另一个对象。而引用一旦绑定到一个对象,就不能再绑定到另一个对象。换句话说,你不能让引用重新指向另一个对象。
  5. 运算:可以对指针进行各种运算,如加法、减法等,使其指向数组中的不同元素。然而,引用主要用于别名,并不支持类似的运算。
  6. 安全性:由于指针可以进行各种复杂的操作,包括解引用空指针等,因此使用指针时更容易出错。相比之下,引用更加安全,因为它避免了空引用和重新绑定的问题。

相关推荐

  1. C++中的指针引用数组

    2024-04-29 11:36:03       49 阅读
  2. c++指针引用的区别

    2024-04-29 11:36:03       51 阅读
  3. C++里指针引用的区别

    2024-04-29 11:36:03       34 阅读
  4. C++引用指针的区别

    2024-04-29 11:36:03       24 阅读
  5. C++ 学习C++ 传值 传指针引用

    2024-04-29 11:36:03       39 阅读
  6. C/C++】基本数据类型—数组、指针引用

    2024-04-29 11:36:03       43 阅读
  7. C/C++ 引用指针的区别及使用场景

    2024-04-29 11:36:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 11:36:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 11:36:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 11:36:03       82 阅读
  4. Python语言-面向对象

    2024-04-29 11:36:03       91 阅读

热门阅读

  1. leetcode刷题:两数之和

    2024-04-29 11:36:03       33 阅读
  2. python--列表

    2024-04-29 11:36:03       37 阅读
  3. Python实现视频转音频

    2024-04-29 11:36:03       34 阅读
  4. React 19 Beta新内容前瞻合集(快速版)

    2024-04-29 11:36:03       26 阅读
  5. SQL常见约束及外键约束删除更新行为

    2024-04-29 11:36:03       35 阅读
  6. 数字信号处理基础

    2024-04-29 11:36:03       32 阅读
  7. C语言实现哈希表

    2024-04-29 11:36:03       35 阅读
  8. Stable Diffusion Windows部署教程

    2024-04-29 11:36:03       35 阅读
  9. Linux连接不上Android设备

    2024-04-29 11:36:03       30 阅读
  10. 安卓手机APP开发__媒体开发部分__用户界面定制

    2024-04-29 11:36:03       28 阅读
  11. android:maxEms=“5“ 为什么可以显示6个文字呢?

    2024-04-29 11:36:03       31 阅读
  12. SpringMVC

    SpringMVC

    2024-04-29 11:36:03      25 阅读
  13. Android 11在app中修改屏幕亮度

    2024-04-29 11:36:03       34 阅读
  14. [SQL系列]从零开始学Clickhouse

    2024-04-29 11:36:03       29 阅读