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