当前位置:网站首页>二级指针的简单理解
二级指针的简单理解
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是一个二级指针的话,改变的是其一级指针指向的变量,分清楚,目的是改变变量的值,还是改变指向的变量。一级指针用于改变指向的变量的值,二级指针用于改变一级指针指向的变量(也是改变一级指针的值,刚好也是改变一级指针的指向的变量)。
边栏推荐
- 【SemiDrive源码分析】【MailBox核间通信】51 - DCF_IPCC_Property实现原理分析 及 代码实战
- @Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
- QoS Quality of Service Seven Switch Congestion Management
- 【毕业设计】基于STM32的天气预报盒子 - 嵌入式 单片机 物联网
- Tf铁蛋白颗粒包载顺铂/奥沙利铂/阿霉素/甲氨蝶呤MTX/紫杉醇PTX等药物
- 【CNN】刷SOTA的trick
- flask生成路由的2种方式和反向生成url
- FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
- 【毕业设计】基于Stm32的智能疫情防控门禁系统 - 单片机 嵌入式 物联网
- QoS Quality of Service Eight Congestion Avoidance
猜你喜欢
We used 48h to co-create a web game: Dice Crush, to participate in international competitions
2022杭电多校七 Black Magic (签到)
[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶"/>
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
网络虚拟化
2019河北省大学生程序设计竞赛部分题题解
CMU博士论文 | 视频多模态学习:探索模型和任务复杂性
QoS Quality of Service Eight Congestion Avoidance
idea插件 协议 。。 公司申请软件用
七月券商金工精选
WCF and TCP message communication practice, c # 】 【 realize group chat function
随机推荐
力扣150-逆波兰表达式求值——栈实现
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
"Distributed Microservice E-commerce" Topic (1) - Project Introduction
优雅退出在Golang中的实现
【luogu CF1534F2】Falling Sand (Hard Version)(性质)(dfs)(线段树 / 单调队列 / 贪心)
echart 特例-多分组X轴
[Teach you how to make a small game] Write a function with only a few lines of native JS to play sound effects, play BGM, and switch BGM
每日一R「03」Borrow 语义与引用
这7个自动化办公模版 教你玩转表格数据自动化
laya打包发布apk
leetcode 84.柱状图中最大的矩形 单调栈应用
nfs挂载服务器,解决挂载后无法更改用户id,无法修改、写文件,文件只读权限Read-only file system等问题
Tf ferritin particles contain cisplatin / oxaliplatin / doxorubicin / methotrexate MTX / paclitaxel PTX and other drugs
Transferrin (TF) Modified Paclitaxel (PTX) Liposomes (TF-PTX-LP) | Transferrin (Tf) Modified Curcumin Liposomes
CMU博士论文 | 视频多模态学习:探索模型和任务复杂性
[CNN] Brush SOTA's trick
不止跑路,拯救误操作rm -rf /*的小伙儿
TDD、FDD是什么意思?
Tf铁蛋白颗粒包载顺铂/奥沙利铂/阿霉素/甲氨蝶呤MTX/紫杉醇PTX等药物
QoS Quality of Service Eight Congestion Avoidance