
tip:本贴为学习和test自测记录,thank you for lmy。
- 引用
- 一级指针和二级指针
- 为什么要用二级指针
- Run一级指针:
- Run二级指针:
float a=0.0 //函数定义
func (a)//函数调用
func(&a){}//函数实现,采用引用的方式不会copy一份,而是直接对地址处数据进行处理
一级指针和二级指针
- 先用一个很好的例子阐述:
void lmy(int &x,float* y,float ** z){}//函数实现,其中x是引用,y是一级指针,z是二级指针
int main(
int a=8
float b=4.0
float c[]={8.0,4.0}
lmy(a,&b,&c)//其中a是int,b地址,c是二级地址(数组名表示地址)
)
- 概念
假设C的地址是四个字节0x00000008,C中的内容是"争渡,争渡,惊起一滩鸥鹭"。B的地址是四个字节0x00000004
对于一级指针:
B= 0x00000008; //B的内容
*B = "争渡,争渡,惊起一滩鸥鹭"; //B解引用,也就是B指针指向的C的值
&B = 0x00000004; //B取地址,B的地址是0x00000004
对于二级指针
*A = B= 0x00000008; //A解引用后是B的内容
**A = *B = "争渡,争渡,惊起一滩鸥鹭"; //B解引用,也就是B指针指向的C的值
A = &B = 0x00000004; //A存的是B的地址,B的地址是0x00000004
&A = 0x00000000; //A取地址
为什么要用二级指针
因为会存在一级指针难以顾及的场景。
Run一级指针:#include
using namespace std;
int z= 4;
int y= 8;
int *m;
void pripointer(int *n)
{
cout<<"n="<<n<<", &n="<<&n<<", *n="<<*n<<endl;
n = &y; //code1
}
int main()
{
m = &z;
cout<<"m="<<m<<", &m="<<&m<<", *m="<<*m<<endl;
pripointer(m);
cout<<"m="<<m<<", &m="<<&m<<", *m="<<*m<<endl;
return (0);
}
输出结果见下
m=0x404068, &m=0x404198, *m=4
n=0x404068, &n=0x7ffdd3d5ef28, *n=4
m=0x404068, &m=0x404198, *m=4
Q1:为什么m没有被修改?
A1:&m!=&n,即一级指针m和n是分别开辟的空间,n=&y只能修改n的指向。
如果想修改*m就需要二级指针 *** 作。
...//部分代码同上
void secpointer(int **n)
{
cout<<"n="<<n<<", &n="<<&n<<", *n="<<*n<<", **n="<<**n<<endl;
*n = &y;
cout<<"n="<<n<<", &n="<<&n<<", *n="<<*n<<", **n="<<**n<<endl;
}
int main()
{
m = &z;
cout<<"m="<<m<<", &m="<<&m<<", *m="<<*m<<endl;
secpointer(&m);
cout<<"m="<<m<<", &m="<<&m<<", *m="<<*m<<endl;
return 0;
}
输出结果如下:
m=0x404068, &m=0x404198, *m=4
n=0x404198, &n=0x7ffe9be33fe8, *n=0x404068, **n=4
n=0x404198, &n=0x7ffe9be33fe8, *n=0x40406c, **n=8
m=0x40406c, &m=0x404198, *m=8
- 这里m是一级指针,&m是作为二级指针参数。 n是二级指针,存储的是&m,所以n=&m 。
- n=&m左右解引用得n=m,即n的解引用n指向m。此时赋值*n=&y,会修改m的值。
- n=m左右解引用得n=*m,即n指向和m指向y。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)