我的三板斧:c++中引用、一级指针、二级指针

我的三板斧:c++中引用、一级指针、二级指针,第1张

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

目录
  • 引用
  • 一级指针和二级指针
  • 为什么要用二级指针
    • Run一级指针:
    • Run二级指针:

引用
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 
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。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/921588.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存