当前位置:网站首页>二级指针的简单理解
二级指针的简单理解
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是一个二级指针的话,改变的是其一级指针指向的变量,分清楚,目的是改变变量的值,还是改变指向的变量。一级指针用于改变指向的变量的值,二级指针用于改变一级指针指向的变量(也是改变一级指针的值,刚好也是改变一级指针的指向的变量)。
边栏推荐
- Heme - gold nanoparticles (Heme - AuNP) composite nanometer enzyme | gold nanoparticles nuclear porous hollow carbon nanometer spherical shell (Au @ HCNs) nano enzyme
- [Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
- (12) findContours function hierarchy explanation
- Optimizing Bloom Filter: Challenges, Solutions, and Comparisons论文总结
- The most complete GIS related software in history (CAD, FME, ArcGIS, ArcGISPro)
- 【CNN】刷SOTA的trick
- 优雅退出在Golang中的实现
- "Distributed Microservice E-commerce" Topic (1) - Project Introduction
- 史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
- (十二) findContours函数的hierarchy详解
猜你喜欢
- [email protected] nanomimetic e"/>
Water-soluble alloy quantum dot nanozymes|CuMoS nanozymes|porous silicon-based Pt(Au) nanozymes|[email protected] nanomimetic e
【LeetCode】42、接雨水
spark学习笔记(九)——sparkSQL核心编程-DataFrame/DataSet/DF、DS、RDD三者之间的转换关系
Multifunctional Nanozyme Ag/PANI | Flexible Substrate Nano ZnO Enzyme | Rhodium Sheet Nanozyme | Ag-Rh Alloy Nanoparticle Nanozyme | Iridium Ruthenium Alloy/Iridium Oxide Biomimetic Nanozyme
Linux服务器安装Redis,详细步骤。
导入FontForge生成字体
Metasploit——渗透攻击模块(Exploit)
【图像分类】2019-MoblieNetV3 ICCV
2022杭电多校七 Black Magic (签到)
whois information collection & corporate filing information
随机推荐
从 GAN 到 WGAN
Implementation of graceful exit in Golang
MySQL数据库的主从复制部署详解
Ransom Letter Questions and Answers
C语言写数据库
mysql踩坑----case when then用法
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
端口探测详解
opengrok搭建[通俗易懂]
1D Array Dynamics and Question Answers
Colocate Join :ClickHouse的一种高性能分布式join查询模型
【CNN】刷SOTA的trick
leetcode 547.省份数量 并查集
leetcode 84.柱状图中最大的矩形 单调栈应用
nfs挂载服务器,解决挂载后无法更改用户id,无法修改、写文件,文件只读权限Read-only file system等问题
铁蛋白颗粒负载雷替曲塞/培美曲塞/磺胺地索辛/金刚烷(科研试剂)
The 2021 ICPC Asia Shanghai Regional Programming Contest D、E
测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离
zip文件协议解析
Common ports and services