当前位置:网站首页>二级指针的简单理解
二级指针的简单理解
2022-08-10 19:43:00 【小哇123】
最近讨论到二级指针,又犯错了,记录一下,实际上指针变量和其他变量的维度是一样的,之所以出现了二级指针,是因为被取地址的变量刚好是一个指针变量。
#include <stdio.h>
int a = 3;
int b = 5;
/*
** change var that the pointer points to
*/
void fun(int* p)
{
p = &b;
return;
}
/*
** main function
*/
int main()
{
int* q = &a;
fun(q);
printf("q points to %d\n", *q);
return 0;
}
结果:q points to 3.
上面这段程序的本意是通过执行fun(int *)函数,改变main()函数中指针指向的变量,让q由指向全局变量a变为指向全局变量b,实际上就是改变指针变量q的值,但运行下来,q还是指向的a,并没有指向b。
当要改变一个非指针类型的变量的值时,有两种方法:(1)将函数返回值赋值给这个变量,通过值传递的方式改变;(2)将这个变量的地址传递出去,通过址传递的方式改变。
从方法(2)出发,现在有一个变量,想要改变这个变量的值,如果采用地址传递,需要取这个变量的地址作为函数参数:在这个例子中,想要改变指针变量q指向的变量,也就是想要改变指针变量q的值,那么采用地址传递的话,以此类推地,就需要取指针变量q的地址,也就是形成一个二级指针,所以,二级指针的概念就这么自然地产生了。
总结一下:
指针的作用是为了改变指针指向地址上的值,
二级指针是为了改变其指向的一级指针的值,也就是改变一级指针指向的变量。
实际上,二级指针是一个自然形成的概念,多用在想要更改一级指针指向的变量。
下面用代码演示一下(1)、(2)两种改变指针指向变量的方法:
(1)值传递:
#include <stdio.h>
/*
** change var that the pointer points to
*/
int a = 3;
int b = 5;
int* fun(int* p)
{
p = &b;
return p;
}
/*
** main function
*/
int main()
{
int* q = &a;
q = fun(q);
printf("q points to %d\n", *q);//输出结果 5
return 0;
}
(2)地址传递:
#include <stdio.h>
/*
** change var that the pointer points to
*/
int a = 3;
int b = 5;
void fun(int* p)
{
*p = &b; 想要改变p指向的变量的值,p这里实际上是一个二级指针,目的是为了让p指向的变量
的值变为b的地址(效果就是让其一级指针指向b变量),也就是*p(一级指针的值)
也就是改变一级指针指向的变量,其实和对其他类型的指针变量
通过指针来修改其指向变量的值没有什么区别
return;
}
/*
** main function
*/
int main()
{
int* q = &a;
fun(&q);
printf("q points to %d\n", *q);//输出结果 5
return 0;
}
实际上,就是这样一件事情,*p = 5,这个操作就是为了改变指针变量p所指向的变量的值,只是如果p是一个二级指针的话,改变的是其一级指针指向的变量,分清楚,目的是改变变量的值,还是改变指向的变量。一级指针用于改变指向的变量的值,二级指针用于改变一级指针指向的变量(也是改变一级指针的值,刚好也是改变一级指针的指向的变量)。
边栏推荐
- Tf ferritin particles contain cisplatin / oxaliplatin / doxorubicin / methotrexate MTX / paclitaxel PTX and other drugs
- 爬虫基本原理介绍、实现以及问题解决
- 子域名收集&Google搜索引擎语法
- 一维数组动态和问题答记
- flask生成路由的2种方式和反向生成url
- (十)图像数据的序列与反序列化
- 多线程与高并发(五)—— 源码解析 ReentrantLock
- (10) Sequence and deserialization of image data
- YOLOv3 SPP source analysis
- 回老家去?
猜你喜欢
idea插件 协议 。。 公司申请软件用
echart 特例-多分组X轴
2022 Hangdian Multi-School Seven Black Magic (Sign-in)
[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶"/>
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
[email protected])纳米酶"/>
血红素-金纳米颗粒(Heme-AuNP)复合纳米酶|金纳米颗粒核多孔空心碳纳米球壳([email protected])纳米酶
Apple Font Lookup
巧用RoaringBitMap处理海量数据内存diff问题
"Distributed Microservice E-commerce" Topic (1) - Project Introduction
转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec Paper Summary
随机推荐
史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
[SemiDrive source code analysis] [MailBox inter-core communication] 52 - DCF Notify implementation principle analysis and code combat
Kyligence 通过 SOC 2 Type II 审计,以可信赖的企业级产品服务全球客户
QoS Quality of Service Eight Congestion Avoidance
转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
Modern Privacy-Preserving Record Linkage Techniques: An Overview论文总结
铱钌合金/氧化铱仿生纳米酶|钯纳米酶|GMP-Pd纳米酶|金钯复合纳米酶|三元金属Pd-M-Ir纳米酶|中空金铂合金纳米笼核-多空二氧化硅壳纳米酶
@Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
2022 Hangdian Multi-School Seven Black Magic (Sign-in)
Linux服务器安装Redis,详细步骤。
2020 ICPC Shanghai Site G
电信保温杯笔记——《统计学习方法(第二版)——李航》第17章 潜在语义分析
每日一R「03」Borrow 语义与引用
从 Delta 2.0 开始聊聊我们需要怎样的数据湖
『牛客|每日一题』岛屿数量
Heme - gold nanoparticles (Heme - AuNP) composite nanometer enzyme | gold nanoparticles nuclear porous hollow carbon nanometer spherical shell (Au @ HCNs) nano enzyme
越折腾越好用的 3 款开源 APP
赎金信问题答记
C语言写数据库
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶