指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ;
使用 二级指针 作为参数 , 可以实现如下功能 :
void createArray(int **arr, int size) {
*arr = malloc(size * sizeof(int));
}
void changePointer(int **ptr) {
int new_value = 10;
*ptr = &new_value; // 修改指针值
}
void process2DArray(int **array, int rows, int cols) {
//...
}
普通变量的 引用 , 调用时可以直接当做 普通变量 使用 , 可实现的功能 相当于 一级指针 ;
一级指针的 引用 , 调用时可以直接当做 一级指针 使用 , 可实现的功能 相当于 二级指针 ;
N 级指针的 引用 , 调用时可以直接当做 N 级指针 使用 , 可实现的功能 相当于 N + 1 级指针 ;
在 C++ 语言 中 , 使用 引用 时 , C++ 编译器 会自动将 引用 翻译为 一级指针 使用 , 自动 在 一级指针 变量 旁边加上 取地址符号 & 和 取值符号 * ;
指针的引用 就相当于 二级指针 , 其 实现的效果 , 等同于 二级指针 ;
C++ 编译器 遇到 指针的引用 时 , 会自动将 引用指针 转为 二级指针 ;
使用函数进行间接赋值 , 需要满足如下三个条件 :
如果将 函数 的形参类型 设置为 引用 类型 , 也能达到 间接赋值 的效果 ;
引用 实际上是 把 间接赋值 的三个条件的后两个条件进行了合并 , C++ 编译器遇到引用 , 还是需要将 引用 还原为 C 语言中的 取地址 传入函数 , 在函数内部使用指针访问实参 ;
该 函数 的 参数 是 一级指针的引用 , 使用该参数时 可以当做 一级指针使用 , 其效果 等同于 二级指针 ; 其效果等同于上一篇博客 【C++】C++ 引用详解 ⑥ ( 普通变量 / 一级指针 / 二级指针 做函数参数的作用 ) 中的 int getStudent(Student** stu)
函数 ;
// 参数是 一级指针的引用
// 该参数 是 一级指针的引用
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)
调用该 一级指针 的 引用 , 可以直接访问 一级指针 , 不需要使用 * 符号 ;
因此 这里 直接为 一级指针 进行内存分配 ;
如果此处是二级指针 , 需要先试用 * 符号 取出二级指针指向的一级指针 , 然后再为该 一级指针 分配内存 ;
// 为形参中声明的 Student* 指针的引用 分配内存
// 一维指针的引用 相当于直接访问一维指针
// 相当于为 main 函数中的 Student* stu 变量赋值
p = (Student*)malloc(sizeof(Student));
// 如果传入的是二维指针参数 Student** p
// 上述操作等同于
// *p = (Student*)malloc(sizeof(Student));
代码示例 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
struct Student
{
char name[64];
int age;
};
// 参数是 指针的引用
// 该参数 是 一级指针的引用
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)
{
// 为形参中声明的 Student* 指针的引用 分配内存
// 一维指针的引用 相当于直接访问一维指针
// 相当于为 main 函数中的 Student* stu 变量赋值
p = (Student*)malloc(sizeof(Student));
// 如果传入的是二维指针参数 Student** p
// 上述操作等同于
// *p = (Student*)malloc(sizeof(Student));
if (p == NULL)
{
// 分配内存失败 , 返回错误码 2
return 2;
}
// 设置结构体成员值
p->age = 18;
// 执行成功
return 0;
}
int main() {
// 声明 Student 对象
Student* stu = NULL;
// 调用函数 将二级指针传入函数
// 在函数内部创建 Student 对象
getStudent(stu);
// 打印结构体成员
printf("stu->age = %d\n", stu->age);
// 控制台暂停
system("pause");
return 0;
}
执行结果 :
stu->age = 18
请按任意键继续. . .