前提
已经清晰一级指针和引用。
可参考:指针和引用与及指针常量和常量指针 或查阅其他资料。
一级指针和二级指针
例子
个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析,可参考文末参考文章。
#include <iostream>
using namespace std;
void make(int **pp)
{
**pp = 66;//这样只是改变了指向的值,即a, 指向没有改变
}
int main()
{
int a=5;
int *q=&a;
int **pp=&q;
cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl;
//可将下面的注释去掉运行通过结果对比查看一级指针与二级指针的关系
// cout<<*pp<<" "<<&*pp<<" "<<*&pp<<" "<<**pp<<endl;
make(pp);
cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl;
return 0;
}
运行结果:
如果改为:
#include <iostream>
using namespace std;
void make(int **pp)
{
int * p=new int(66);
*pp=p; //这样便使用函数通过二级指针更改了一级指针的指向(值便也改了),但原指向
}
int main()
{
int a=5;
int *q=&a;
int **pp=&q;
cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl;
make(pp);
cout<<"address:"<<&pp<<" "<<pp<<" "<<&q<<" "<<q<<" value:"<<*q<<" "<<a<<endl;
}
运行结果:
指针引用
#include<iostream>
using namespace std;
void make(int *pp)
{
pp=new int(66); //试图改变p指向的地址,但没有用,因为pp只是p的一个拷贝。
}
int main()
{
int a=5;
int *p=&a; //指针变量指向一个int类型的地址
cout<<"address:"<<&a<<" value:"<<a<<endl;
cout<<"address:"<<p<<" value:"<<*p<<endl;
make(p);
cout<<"address:"<<p<<" value:"<<*p<<endl;
}
运行结果:
更改为:
#include<iostream>
using namespace std;
void make(int *&pp)
{
pp=new int(66); //此时pp相当于p的别名,所以改的就是指针p本身,所以更改成功。
}
int main()
{
int a=5;
int *p=&a; //指针变量指向一个int类型的地址
cout<<"address:"<<&a<<" value:"<<a<<endl;
cout<<"address:"<<p<<" value:"<<*p<<endl;
make(p);
cout<<"address:"<<p<<" value:"<<*p<<endl;
}
运行结果:
参考:
原文地址:https://www.cnblogs.com/clwsec/p/11483193.html
时间: 2024-11-06 03:29:51