栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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="<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="<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。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号