当前位置:网站首页>二级指针的简单理解
二级指针的简单理解
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是一个二级指针的话,改变的是其一级指针指向的变量,分清楚,目的是改变变量的值,还是改变指向的变量。一级指针用于改变指向的变量的值,二级指针用于改变一级指针指向的变量(也是改变一级指针的值,刚好也是改变一级指针的指向的变量)。
边栏推荐
猜你喜欢
[Go WebSocket] Your first Go WebSocket server: echo server

Ferritin particle-loaded raltitrexed/pemetrexed/sulfadesoxine/adamantane (scientific research reagent)

子域名收集&Google搜索引擎语法

主动信息收集

苹果字体查找

【图像分类】2017-MobileNetV1 CVPR

Public Key Retrieval is not allowed(不允许公钥检索)【解决办法】
[email protected])纳米酶"/>血红素-金纳米颗粒(Heme-AuNP)复合纳米酶|金纳米颗粒核多孔空心碳纳米球壳([email protected])纳米酶

The 2021 ICPC Asia Shanghai Regional Programming Contest D、E
[email protected] NPs)"/>转铁蛋白修饰蛇床子素长循环脂质体/负载三七皂苷R1的PEG-PLGA纳米粒([email protected] NPs)
随机推荐
UE4 - 河流流体插件Fluid Flux
转铁蛋白(TF)修饰紫杉醇(PTX)脂质体(TF-PTX-LP)|转铁蛋白(Tf)修饰姜黄素脂质体
Water-soluble alloy quantum dot nanozymes|CuMoS nanozymes|porous silicon-based Pt(Au) nanozymes|[email protected] nanomimetic e
机器学习|模型评估——AUC
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
[SemiDrive source code analysis] [MailBox inter-core communication] 52 - DCF Notify implementation principle analysis and code combat
皮质-皮质网络的多尺度交流
Transferrin-modified vincristine-tetrandrine liposomes | transferrin-modified co-loaded paclitaxel and genistein liposomes (reagents)
Kyligence 通过 SOC 2 Type II 审计,以可信赖的企业级产品服务全球客户
杭电多校七 1003-Counting Stickmen(组合数学)
不止跑路,拯救误操作rm -rf /*的小伙儿
mysql踩坑----case when then用法
电脑为什么会蓝屏的原因
网站架构探测&chrome插件用于信息收集
水溶性合金量子点纳米酶|CuMoS纳米酶|多孔硅基Pt(Au)纳米酶|[email protected]纳米模拟酶|PtCo合金纳米粒子
转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
[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
idea汉化教程[通俗易懂]
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec Paper Summary
Echart饼状图标注遮盖解决方案汇总