C语言一级指针二级指针和 * 指针区别及使用详解
作者:前端跑起来 发布时间:2022-10-21 03:29:34
1.一级指针
#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;?//?p1?=?&data
?printf("data的地址是:%p\n",?&data);
?printf("p1指针变量地址是:%d,内容是%d\n",?p1,?*p1);
?//?通过指针修改变量值
?printf("\n");
?*p1?=?20;
?printf("data=%d,?*p1=%d\n",?data,?*p1);
?return?0;
}
运行结果如下:
data的地址是:00AFFB18
p保存的data的地址是:11533080,内容是10
data=20, *p1=20
一级指针的用法其实是取数据的地址,以此类推,二级指针就是取一级指针的地址,也可以表示一级指针的指向的内容。
2.二级指针
指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。p1是一级指针,指向普通类型的数据,定义时只有一个*;p2是二级指针,指向一级指针p1,定义时需要两个*。
它们关系如下所示:
上图关系所示:data是int类型变量,p1是指向data的指针变量,p2又是指向p1的指针变量。
假设a、p1、p2、p3的地址分别为0x00A0、0x0010、0x0020、0x0030。它们之间的关系可以用下图描述:
根据上图描述的逻辑,代码表示如下:
#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;
?int?**p2?=?&p1;
?printf("%d,?%d,?%d\n",?data,?*p1,?**p2);
?printf("&p1=%#X,?p2=%#X\n",?&p1,?p2);?//?p1的地址为p2的值
?printf("&data=%#X,?p1=%#X\n",?&data,?p1);?//?data的地址为p1的值
?return?0;
}
运行结果如下所示:
10, 10, 10
&p1=0X12FFE94, p2=0X12FFE94
&data=0X12FFEA0, p1=0X12FFEA0
**p2等价于(*(*p2)),
3. * 指针
以此类推,一级指针加一个*,二级指针增加两个*, * 指针增加三个*。
我们可以先用图去梳理指针之间的关系:
假设a、p1、p2、p3的地址分别为0x00A0、0x0010、0x0020、0x0030。它们之间的关系可以用下图描述:
根据上图描述的逻辑,代码表示如下:
#include?<stdio.h>
int?main(){
?int?a?=?100;
?int?*p1?=?&a;
?int?**p2?=?&p1;
?int?***p3?=?&p2;
?printf("%d,?%d,?%d,?%d\n",?a,?*p1,?**p2,?***p3);
?printf("&p2?=?%#X,?p3?=?%#X\n",?&p2,?p3);
?printf("&p1?=?%#X,?p2?=?%#X,?*p3?=?%#X\n",?&p1,?p2,?*p3);
?printf("?&a?=?%#X,?p1?=?%#X,?*p2?=?%#X,?**p3?=?%#X\n",?&a,?p1,?*p2,?**p3);
?return?0;
}
100, 100, 100, 100
&p2 = 0XC2FB7C, p3 = 0XC2FB7C
&p1 = 0XC2FB88, p2 = 0XC2FB88, *p3 = 0XC2FB88
&a = 0XC2FB94, p1 = 0XC2FB94, *p2 = 0XC2FB94, **p3 = 0XC2FB94
以 * 指针 p3 为例来分析上面的代码。***p3等价于*(*(*p3))。*p3 得到的是 p2 的值,也即 p1 的地址;*(*p3) 得到的是 p1 的值,也即 a 的地址;经过三次操作后,*(*(*p3)) 得到的是 a 的值。
来源:https://z6r.cn/jPJow6


猜你喜欢
- 前言前面一篇文章分析了 InputReader 对按键事件的流程流程,大致上就是根据配置文件把按键的扫描码(scan code)转换为按键码
- 本文实例为大家分享了java文件读写工具类的具体代码,供大家参考,具体内容如下import java.io.BufferedInputStr
- Android自定义短信验证码组件,供大家参考,具体内容如下效果图1.布局实现因为要禁用光标,所以我用TextView代替了EditText
- 用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好;Android并没有给我们封装这样一个效果,我们来看下
- Map在Java8中新增了两个replace的方法1.replace(k,v)在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到
- public void CutToF(Stream stream)
- 调用API设置鼠标位置并模拟鼠标右键让人物走动,全局钩子等using System;using System.Collections.Ge
- cookie机制和session机制的区别具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持
- 觉得作者写得太好了,不得不收藏一下。对这个例子的理解://类型参数不能用基本类型,T和U其实是同一类型。//每次放新数据都成为新的top,把
- 本文实例讲述了在C#中实现多线程中调用winform窗体控件的方法,对于C#程序设计的学习有着很好的借鉴参考价值。具体方法如下:首先,由于W
- 引言本文是关于Spark优化性能与内存使用的最佳实践,翻译整理自Tuning - Spark 3.3.2 Documentation。由于s
- 动态内存管理为什么存在动态内存分配我们到现在为止掌握的是什么样的内存开辟方式呢//创建一个变量int val = 20; &n
- 话不多说,请看实例代码String ip = request.getHeader("x-forwarded-for");
- 这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量)在讨论这个问题之前,我们看一段特别特别简单的代码
- **请注意!请注意!!!**今天讲给大家讲解非常“有用”的设计模式,解释器模式!!!设计模式有三大种类,一种是创建型模式,一种是结构型模式,
- 本文实例讲述了C#使用linq对数组进行筛选排序的方法。分享给大家供大家参考。具体如下:using System;using System.
- 概述在JDK 1.8里,可以使用如下代码获取List元素对象中某个属性的列表。package test;import java.util.A
- 开发工具 :idea工程结构:父工程father子模块 dao (用于持久化数据跟数据库交互)子模块 entity (实体类)子模块 ser
- 项目中肯定会遇到异步调用其他方法的场景,比如有个计算过程,需要计算很多个指标的值,但是每个指标计算的效率快慢不同,如果采用同步执行的方式,运
- 前言:最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活