引入
struct node {
int x,y;
};
void init(node* &s) {
s = new node[10];
s->x = 1,s->y = 114514;
}
int main(int argc, char const *argv[])
{
node* s;
init(s);
cout << s->x << " " << s->y << endl;
delete s;
return 0;
}
这个所谓的 *&,某些书上老是爱写成 XXX *&a 的形式,就是容易误解所有了解较浅的人,难道不是写成 XXX* &a 的形式更能突出性质吗?
以上面代码例子为例,这里的 init 传参不就是一个 node 结构体的指针,以引用形式传递,因此可以在函数内直接修改 s 的值,而不需要通过 return 返回吗…
使用二级指针
使用二级指针的例子:
#include <iostream>
void modifyPointer(int **ptr)
{
static int newValue = 20;
*ptr = &newValue; // 修改指针的指向(要解一层引用)
}
int main()
{
int a = 10;
int *p = &a;
std::cout << "Before: " << *p << std::endl; // 输出 10
modifyPointer(&p); // 传递指针的地址
std::cout << "After: " << *p << std::endl;
return 0;
}
使用指针引用的例子:
#include <iostream>
void modifyPointer(int* &ptr) {
static int newValue = 20; // 静态变量,生命周期持续到程序结束
ptr = &newValue; // 直接修改指针的指向
}
int main() {
int a = 10;
int* p = &a; // p 指向 a 的地址
modifyPointer(p); // 直接传递指针 p
std::cout << *p << std::endl; // 输出 20
return 0;
}
管理数组的例子
#include <iostream>
void createArray(int** arr, int size) {
// 动态分配一维数组
*arr = new int[size]; // 分配数组
for (int i = 0; i < size; ++i) {
(*arr)[i] = i + 1; // 示例赋值
}
}
void deleteArray(int* arr) {
delete[] arr; // 释放内存(数组类型)
}
int main() {
int* myArray = nullptr; // 初始化指针
int size = 5;
// 创建数组
createArray(&myArray, size);
// 打印数组
for (int i = 0; i < size; ++i) {
std::cout << myArray[i] << " "; // 输出每个元素
}
std::cout << std::endl;
// 释放内存
deleteArray(myArray);
return 0;
}
使用智能指针
为了更加安全的管理指针的生命周期,同时增加可读性,使用智能指针来优化:
#include <iostream>
#include <memory>
void modifyPointer(std::unique_ptr<int>& ptr) {
ptr = std::make_unique<int>(20); // 智能指针所有权转移给ptr
}
int main() {
std::unique_ptr<int> p = std::make_unique<int>(10);
std::cout << "Before: " << *p << std::endl; // 输出 10
modifyPointer(p); // 修改指针的指向
std::cout << "After: " << *p << std::endl; // 输出 20
return 0;
}
607

被折叠的 条评论
为什么被折叠?



