1. 指针
指针是C++中的一个重要概念,它是一个变量,存储着另一个变量的内存地址。通过指针访问该内存地址中存储的数据,可以实现对该数据的直接操作。指针的定义方法为在变量名前加上星号(*),表示该变量是一个指针。例如,下面的代码定义了一个指向整型变量的指针ptr:
int a = 10;
int* ptr = &a;
// 使用指针访问变量a
*ptr = 20;
该代码首先定义了一个整型变量a并初始化为10,然后定义了一个指向a变量的指针ptr并初始化为a变量的地址。在最后一行代码中,通过星号(*)访问了ptr指向的变量a,并将其值修改为20。此时a变量的值也随之变为20。
1.1 指针的使用
指针在C++中广泛用于以下情况:
动态分配内存
数组的操作
函数的参数传递
实现数据结构
其中,比较常见的是动态分配内存和函数的参数传递。
1.2 动态分配内存
动态分配内存是指在程序运行过程中根据需要申请内存空间,这样可以灵活控制内存的使用。C++提供了两个操作符用于动态分配内存:new和delete。
new操作符用于申请内存空间,其语法为:
p = new T;
其中p是一个指针,指向类型为T的内存空间。例如下面的代码申请了一个整型变量的内存空间:
int* p = new int;
*p = 10;
该代码申请了一个整型变量的内存空间并初始化为10,p指向该内存空间。
delete操作符用于释放内存空间,其语法为:
delete p;
其中p是一个指向空间的指针。例如下面的代码释放了之前申请的内存空间:
delete p;
1.3 函数参数传递
在函数的参数列表中使用指针参数,可以实现对参数变量的修改。例如下面的代码定义了一个函数,参数为一个指向整型变量的指针:
void func(int* p)
{
*p = 20;
}
int main()
{
int a = 10;
func(&a);
return 0;
}
该代码定义了一个名为func的函数,参数为一个指向整型变量的指针p。在函数体中,通过星号(*)访问了该指针指向的变量,并将其值修改为20。在main函数中,定义了一个整型变量a并初始化为10,然后调用了func函数并将a的地址作为参数传递给了func函数。func函数执行完毕后,a的值变为20。
2. 引用
引用是C++中的另一个重要概念,也是指针的一种简化写法。引用可以看做是已存在变量的别名,它不是一个独立的变量,而是对已存在变量的另一种访问方式。引用的定义方法为在变量名前加上&符号。例如下面的代码定义了一个引用ref:
int a = 10;
int& ref = a;
该代码定义了一个整型变量a并初始化为10,然后定义了一个对a的引用ref。此时ref可以看做是a的别名,对ref的操作等同于对a的操作。
2.1 引用的使用
引用相对于指针的优点在于其更直观。使用引用可以避免指针的繁琐语法和指针常量的复杂性。
2.2 引用和指针的区别
引用和指针的使用虽然有很多相似之处,但是两者之间还是存在一些区别的。
首先,引用必须在定义时初始化,而指针可以在任何时候初始化。其次,引用一旦初始化就不能再引用其他变量,而指针可以在任何时候指向其他变量。最后,空指针和指向空指针的指针都是合法的,而空引用是不合法的。
3. 总结
在C++中,指针和引用都是非常重要的概念,它们可以实现对变量的灵活操作。指针和引用在使用时需要注意一些细节,比如指针的初始化和释放、引用的初始化和生命周期等等。在实际开发中,需要根据具体情况来选择使用指针或引用,以达到最佳效果。