c++中引用、一级指针、二级指针

本文介绍了C++中的引用、一级指针和二级指针的概念,并通过实例解释了为何需要使用二级指针。通过运行示例代码,展示了如何在一级和二级指针情况下进行操作,说明了二级指针在修改一级指针内容时的重要性。

tip:本贴为学习和test自测记录,thank you for lmy

引用

float a=0.0 //函数定义
func (a)//函数调用
func(&a){}//函数实现,采用引用的方式不会copy一份,而是直接对地址处数据进行处理

一级指针和二级指针

  1. 先用一个很好的例子阐述:
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是二级地址(数组名表示地址)
)
  1. 概念

假设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<iostream> 
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就需要二级指针操作。

Run二级指针:

...//部分代码同上
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
  1. 这里m是一级指针,&m是作为二级指针参数。 n是二级指针,存储的是&m,所以n=&m 。
  2. n=&m左右解引用得n=m,即n的解引用n指向m。此时赋值*n=&y,会修改m的值。
  3. n=m左右解引用得n=*m,即n指向和m指向y。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值