C语言中的灵魂-指针

news/2024/4/17 5:39:17/文章来源:https://blog.csdn.net/mukewangguanfang/article/details/130320451

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"!

作者:张磊|慕课网讲师


C 语言中的指针

C 语言的指针常常被人们认为是 C 语言中的灵魂所在,可以完成很多高难度的操作。但是更多的人感觉 C 语言的指针的存在如同噩梦一般,因为稍不注意,就会引起灾难性的后果。
不管你是不是喜欢 C 语言中的指针,我们都要学习这种看起来很神奇的东西。因为指针这个概念不是 C 语言首创的,而是苏联的计算机科学家首创的。

1. 什么是指针?

指针是什么?这是来自灵魂的拷问。其实指针也是一种变量。我们之前也说过。只不过存储的是另外一个变量的地址。变量地址是变量在内存中存储的位置索引。

`int *a;int b=5;a = &b; ``

这里我们定义了一个整数类型的指针 ​​a​​​ ,可以看出指针的定义与变量的声明是一致的,只不过需要在变量明前加上一个额外的字符 ​​*​​ 。

由于指针中存储的应该是变量的地址,因此我们在赋值的时候需要获得变量的地址,而不是变量本身所存储的数值。这里我们采用的 ​​&​​ 来获取变量的地址。将获取到的地址赋值给指针变量。

要是想使用指针中存储地址中所存储的值,那么就需要在指针变量名前加 ​​*​​ 来获取相应地址中存储的值。

2. 示例程序

#include <stdio.h>int main()
{int *a, b = 100, *c;printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a);printf("b value = %d, b address = %p\n", b, &b);printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c);a = &b;printf("a value = %p, a address = %p, a point value = %d\n", a, &a, *a);c = a;printf("c value = %p, c address = %p, c point value = %d\n", c, &c, *c);printf("b value = %d, b address = %p\n", b, &b);return 0;
}

运行结果:

示例中的运行结果中的十六进制所表示的地址每台机器都会不太一样,甚至每次运行都会发生变化。因为操作系统每次为系统分配的内存都不太一样。

a value = 0x7fffaf0005a0, a address = 0x7fffd2942a28, a point value = -1991643855
b value = 100, b address = 0x7fffd2942a24
c value = 0x7fffd2942b20, c address = 0x7fffd2942a30, c point value = 1
a value = 0x7fffd2942a24, a address = 0x7fffd2942a28, a point value = 100
c value = 0x7fffd2942a24, c address = 0x7fffd2942a30, c point value = 100
b value = 100, b address = 0x7fffd2942a24

示例程序中声明了一个整数类型的指针 ​​a​​​ ,同时还声明并初始化了一个整数类型的变量 ​​b​​ 。

我们首先展示了此时此刻指针变量 ​​a​​​ 中存储的值,也就是一个内存地址,这个地址为 ​​0x7fffaf0005a0​​​ ,同时 ​​a​​​ 变量本身的地址为 ​​0x7fffd2942a28​​​ ,此时其存储的内存地址中所存储的值为 ​​-1991643855​​​ 。这里需要说明的是, ​​a​​ 变量此时还没有初始化,没有赋值,里面存储的数值是随机的,所以其代表的值也是随机的,必须在赋值以后才能使用。这点和所有的变量的使用是一致的。

变量 ​​b​​​ 的存储的数值为 ​​100​​​ ,其内存的地址为 ​​0x7fffd2942a24​​ 。

指针变量 ​​c​​​ 中存储的数值是地址 ​​0x7fffd2942b20​​​ ,其本身的地址是 ​​0x7fffd2942a30​​​ ,里面存储的地址中存储的数值为 ​​1​​ 。

然后我们进行了一次赋值的操作。这里的赋值操作,就是将变量 ​​b​​​ 的地址赋给了变量 ​​a​​。

这个时候你会发现变量 ​​a​​​ 中存储的数值变成了变量 ​​b​​​ 的地址,而变量 ​​a​​​ 自己的地址是没有发生变化的,而变量 ​​a​​​ 中所存储的地址中的值也编程了变量 ​​b​​​ 中所存储的值 ​​100​​ 。

指针之间的赋值就比较直接,和普通变量的赋值是一样的,只要直接赋值就可以了。

下面的表格展示了这一系列的变化

初始状态

变量名

变量中数值

地址

指针地址中数值

a

0x7fffaf0005a0

0x7fffd2942a28

-1991643855

b

100

0x7fffd2942a24

c

0x7fffd2942b20

0x7fffd2942a30

1

赋值后

变量名

变量中数值

地址

a

0x7fffd2942a24

0x7fffd2942a28

b

100

0x7fffd2942a24

c

0x7fffd2942a24

0x7fffd2942a30

结尾

指针作为 C 语言中相对比较抽象的部分,是很多初学者最难逾越的部分。但是请大家放松心情。因为指针其实和普通变量没有什么本质的区别,其实叫做指针变量更为贴切一点。指针是一个变量,里面存储的内容是另外一个变量的内存地址。每个变量都会有地址,包括指针变量自己本身也是有地址存在的。我们在赋值的时候是将别的变量通过变量名获得的该变量的地址存储到指针变量里,而后获取这个被存储到指针变量里的地址的数值,或者继续将该变量的地址赋值给另外一个指针变量。指针变量的存在只是一个变量的赋值,切记理解为玄学。


欢迎关注「慕课网」帐号,我们会一直坚持内容原创,提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103520.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隋唐洛阳“西宫”:上阳宫的GIS视角

隋唐洛阳城简介 营建 隋大业元年&#xff08;605年&#xff09;&#xff0c;在隋炀帝的授意下&#xff0c;隋代著名城市设计师宇文恺&#xff0c;在汉魏故城以西重新选址&#xff0c;历时8个月&#xff0c;日役劳工200万&#xff0c;兴建新都洛阳城。 城和苑 隋唐洛阳城采用…

eBPF技术介绍

前言 eBPF起源于linux内核&#xff0c;它可以以砂箱程序运行在操作系统内核的特权上下文&#xff0c;高效&#xff0c;安全&#xff0c;易于扩展而不需要修改内核源码或者加载内核模块。 操作系统一直是实现观测&#xff0c;安全和网络功能的最理想的地方&#xff0c;因为内核的…

优思学院|精益管理的理念是什么?

作为一个企业&#xff0c;我们都希望拥有高效率和优异的竞争力。但是&#xff0c;如何才能在竞争激烈的市场中脱颖而出&#xff1f;这时&#xff0c;精益管理理念的出现可以帮助我们。 精益管理的基本概念是什么&#xff1f; 精益管理的核心理念是通过消除浪费来实现生产效率…

Java线程间通信方式(3)

前文了解了线程通信方式中的CountDownLatch&#xff0c; Condition&#xff0c;ReentrantLock以及CyclicBarrier&#xff0c;接下来我们继续了解其他的线程间通信方式。 Phaser Phaser是JDK1.7中引入的一种功能上和CycliBarrier和CountDownLatch相似的同步工具&#xff0c;相…

辛弃疾最经典的10首词

他&#xff0c;文能挥笔填词&#xff0c;武能上马杀敌&#xff1b; 他&#xff0c;被称为“词中之龙”&#xff0c; 他&#xff0c;一生赤子&#xff0c;追求收复山河&#xff1b; 他&#xff0c;是与苏轼齐名的豪放派词人&#xff1b; 他是辛弃疾。 辛弃疾一生怀着赤子之…

IO多路复用——select函数

1.select函数原型和fd_set结构体说明 1.1 select函数原型 ​ 使用 select 这种 IO 多路转接方式需要调用一个同名函数 select&#xff0c;这个函数是跨平台的&#xff0c;Linux、Mac、Windows 都是支持的。程序员通过调用这个函数可以委托内核帮助我们检测若干个文件描述符的…

【MCS-51】51单片机结构原理

至今为止&#xff0c;MCS-51系列单片机有许多种型号的产品&#xff1a;其中又分为普通型51&#xff08;8031、8051、89S51&#xff09;和增强型52&#xff08;8032、8052、89S52等&#xff09;。它们最大的区别在于存储器配置各有差异。下面我举例子的都是8051这一系列的单片机…

STM32-HAL-定时器(无源蜂鸣器的驱动)

文章目录 一、蜂鸣器的介绍二、常用的无源蜂鸣器的电路三、测试准备四、初始化片上外设4.1 初始化定时器4的通道2为PWM输出模式4.2 编写驱动代码4.3 Logic分析仪查看波形4.4 代码分析 一、蜂鸣器的介绍 有源蜂鸣器&#xff1a; 有源蜂鸣器内部有一个发声电路,也就是“源”&…

数据湖Iceberg-Hive集成Iceberg(3)

文章目录 Hive集成Iceberg环境准备Hive与Iceberg的版本对应关系如下上传jar包&#xff0c;拷贝到Hive的auxlib目录中修改hive-site.xml&#xff0c;添加配置项启动 HMS 服务启动 Hadoop 创建和管理 Catalog默认使用 HiveCatalog指定 Catalog 类型使用 HiveCatalog使用 HadoopCa…

C++学习记录——이십 map和set

文章目录 1、setmultiset 2、map3、map::operator[] 1、set vector/list/deque等是序列式容器&#xff0c;map&#xff0c;set是关联式容器。序列式容器的特点就是数据线性存放&#xff0c;而关联式容器的数据并不是线性&#xff0c;数据之间有很强的关系。 它们的底层是平衡…

在当前互联网行情下,Android想转音视频开发,会有前景吗?

前言 近年来&#xff0c;由于三年疫情的影响&#xff0c;很多公司都开始陆陆续续的在裁员&#xff0c;Android开发工作岗位也是&#xff0c;可能有些从事Android开发的朋友还没有意识到&#xff0c;Android开发岗位正在变少&#xff0c;求职者&#xff0c;僧多粥少&#xff0c…

视频大文件传输的演变:从“卷轴男孩”到自动化

200年前&#xff0c;从纽约市到英国伦敦的单程旅行需要乘坐一艘跨大西洋轮船将近三周——如果你能负担得起的话&#xff0c;那就是。那些不能在满是汗水、狭窄的帆船上安顿大约一个半月的人。 今天&#xff0c;视频专业人士能够在几小时甚至几分钟内跨越相同的物理距离传输大量…

《用于估计血压变化的光电体积描记图和心电图的特征》阅读笔记

目录 一、摘要 二、十大问题 Q1论文试图解决什么问题&#xff1f; Q2这是否是一个新的问题&#xff1f; Q3这篇文章要验证一个什么科学假设&#xff1f; Q4有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f; Q5论文中提…

微信小程序第五节——登录那些事儿(超详细的前后端完整流程)

&#x1f4cc; 微信小程序第一节 ——自定义顶部、底部导航栏以及获取胶囊体位置信息。 &#x1f4cc; 微信小程序第二节 —— 自定义组件 &#x1f4cc; 微信小程序第三节 —— 页面跳转的那些事儿 &#x1f4cc; 微信小程序第四节—— 网络请求那些事儿 &#x1f61c;作 …

MFC之CRect详解

2023年4月25日&#xff0c;周二晚上。 今天查了不少关于CRect类及其相关内容的资料&#xff0c;学到了不少东西&#xff0c;所以我决定写一篇详细的关于CRect类及其相关内容的文章&#xff0c;以记录今天所学。 CRect类 在 MFC 中&#xff0c;CRect 类表示一个矩形区域。它是…

linux 命令之 tar -czvf和 tar -xzvf

文章目录 一、概述&#xff1a;二、基础知识 一、概述&#xff1a; tar 用于linux 系统中压缩和解压 二、基础知识 tar常用命令参数说明 tar命令的czvf/xzvf参数分别代表的意义如下&#xff1a; -c 或–create 建立新的备份文件。 -x或–extract或–get 从备份文件中还原文件…

SparkStreaming学习之——无状态与有状态转化、遍历kafka的topic消息、WindowOperations

目录 一、状态转化 二、kafka topic A→SparkStreaming→kafka topic B (一)rdd.foreach与rdd.foreachPartition (二)案例实操1 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 (三)案例实操2 1.需求&#xff1a; 2.代码实现&#xff1a; 3.运行结果 三、W…

Eclipse代码提示突然失灵的解决方案

不知道改动了啥&#xff0c;突然间Eclipse的代码提示就失效了&#xff0c;发现缺少后极不方便。 使用快捷键&#xff1a;Alt/ 提示 No Default Proposals 为什么使用快捷键&#xff1a;Alt/ 会提示“No Default Proposals。”呢&#xff1f; 网上提示可能是热键冲突 但是一套…

数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

数据可视化大屏电商数据展示平台 一、前言二、项目介绍三、项目展示四、项目经验分享4.1 翻牌器4.1.1 翻牌器-今日实时交易4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指标的数据MySql内部的时间计算 4.3 实时交易播报MySql联表查询和内部遍历循环 4.4 每日交易量4.4.1.近…

5.5 高斯型求积公式简历

学习目标&#xff1a; 我会按照以下步骤学习高斯求积公式简介&#xff1a; 理解积分的概念&#xff1a;学习什么是积分以及积分的几何和物理意义&#xff0c;如面积、质量、电荷等概念。 掌握基本的积分技巧&#xff1a;掌握基本的积分公式和技巧&#xff0c;如换元法、分部积…