自学C语言-10

第10章 指针

	指针是C语言的一个重要组成部分,是C语言的核心、精髓所在。用好指针,可以在C语言开发中起到事半功倍的效果。一方面,可以提高程序的编译效率、执行速度,以及动态存储分配;另一方面,可使程序更加灵活,表示和操作各种数据结构更便捷,编写出高质量的应用程序。本章的知识架构及重难点如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f4e20eaa276842cb858064652fabaff1.png#pic_center)

在这里插入图片描述

10.1 指针的相关概念

	指针是C语言的独特之处,其使用起来十分灵活。使用得当,能显著提高某些程序的效率;使用不当,则很容易造成系统错误。许多程序“挂死”往往都是错误地使用指针造成的。

10.1.1 地址与指针

要想弄明白什么是指针,就必须弄清楚数据在内存中是如何存储的,又是如何被读取的。
通常来说,系统会按字节对每个内存单元进行编号,这些内存单元就好比是许多带有编号的小房间,要想使用内存,就需要知道房间编号。例如,定义一个整型变量i需要4个字节,编译器就会为其分配4个内存单元,如图10.1所示,1000~1003就是对应变量i的4个内存单元地址,其内存放的数值是0。假设又定义了一个整型变量j,则j在内存中的起始地址是1004,因为j同样占4个字节,所以1004~1007单元中保存的是j,其值是1。同理,1008~1012、1012~1016、1016~1020也同样是3个整型变量对应的内存空间,如图10.2所示。可见,编译系统为每个变量都分配了一个能满足其类型大小的内存单元地址,访问该地址就能找到对应变量。那么,程序设计中,又该如何访问变量的地址呢?前面我们学习过取地址符“&”,其作用是获取变量在内存中的地址。例如,&i表示变量i的内存起始地址1000。通过&i可以访问变量i指向的内存单元,进而读取变量i。如图10.3所示,“指向”某个变量地址用箭头表示,就好像旅店住宿时某个房间号牌指向某个房间一样。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3aae38d6428a405b9ece5b93c0712604.png#pic_center)

在这里插入图片描述为了好记忆,我们将变量的地址形象化地称为该变量的“指针”,意思是通过它能访问以它为地址的内存单元。例如,通过地址1000可以访问变量i的地址,进而读取4个字节得到i的值。

10.1.2 变量与指针

	变量的地址是变量和指针之间的连接纽带。所谓“指向”,是通过地址来体现的。因为指针变量通常指向一个变量的地址,所以将一个变量的地址赋给指针变量后,这个指针变量就“指向”了该变量。例如,将变量i的地址&i存放到指针变量p中,p就指向i,其关系如图10.4所示。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a0f16b11efcf43a2ae369b001d74a6aa.png#pic_center)

在这里插入图片描述

	程序代码中一般通过变量名对内存单元进行存取操作,但代码编译后,会将变量名转换为该变量在内存中的存放地址,后续对变量值的存取都是通过该地址进行的。例如,对图10.2中的变量i和变量j进行如下求和操作:
i+j;
计算机内部的存取流程是:根据变量名与地址的对应关系,找到变量i的地址1000,然后从1000开始读取4个字节数据放到CPU寄存器中,再找到变量j的地址1004,从1004开始读取4个字节的数据放到CPU的另一个寄存器中,通过CPU的加法中断计算出结果。
低级语言(如汇编语言)中一般直接通过地址来访问内存单元,高级语言中一般使用变量名来访问内存单元。C语言作为高级语言,仍然提供了通过地址来访问内存单元的方式。

10.1.3 指针变量

一个变量的地址称为该变量的指针。如果有一个变量专门用来存放另一个变量的地址,它就是指针变量。在C语言中有专门用来存放内存单元地址的变量类型,即指针类型。

1.指针变量的定义

定义指针变量的一般形式如下:

类型说明   * 变量名

其中,“*”表示该变量是一个指针变量,“变量名”即为定义的指针变量名,“类型说明”表示本指针变量所指向的变量的数据类型。

2.指针变量的赋值

	指针变量同普通变量一样,使用前需要先进行定义并赋予具体的值。未经赋值的指针变量不能使用。与其他变量赋值不同,给指针变量赋值只能赋予地址,而不能是其他数据,否则将引起错误。C语言一般用“&变量名“表示某个变量的地址,如&a表示变量a的地址,&b表示变量b的地址。给一个指针变量赋值可以有以下两种方法。**(1)定义指针变量的同时进行赋值。例如:**
int a;
int *p=&a;

(2) 先定义指针变量,之后再赋值。例如:

int a;
int *p;
p=&a;
注意:
注意这两种赋值语句的区别。如果先定义指针变量之后再赋值,赋值时指针变量前不再加"*"

【例10.1】输出某个数的地址 从键盘中输入一个数,利用指针将这个数的地址以十六进制形式输出。实现代码如下:

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

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

相关文章

playwright录制脚本原理

Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时,点击录制按钮,会开启一个新浏览器,如下图所示,在新开浏览器页…

Hive基础知识(十八):Hive 函数的使用

1. 系统内置函数 1)查看系统自带的函数 hive (hive3)> show functions; Time taken: 0.085 seconds, Fetched: 289 row(s) 2)显示自带的函数的用法 hive (hive3)> desc function upper; OK tab_name upper(str)- Returns str with all characters…

“了解MySQL中的enum枚举数据类型“

目录 # 开篇 1. 创建包含枚举类型的表 2. 插入枚举类型的数据 3. 查询包含枚举类型的表 4. 更新枚举类型的数据 5. 使用枚举类型的好处 注意事项 示例总结 附加 # 开篇 在数据库中,枚举(ENUM)是一种数据类型,用于存储一组…

即插即用篇 | 手把手教你 YOLOv10 添加注意力机制 | 20+ 种全打通!

YOLOv10 添加注意力机制 ! 视频教程地址-哔哩哔哩 文章目录 YOLOv10 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码2. CBAM 注意力模块2.1 原理2.2 代码3. ECA 注意力模块3.1 原理3.2 代码4. CA 注意力模块4.1 原理4.2 代码5. 添加方式�…

构建开源多模态RAG系统

在这个新的冒险中,我们将深入研究使用开源大型语言多模态(LLMM)构建检索增强型生成(RAG)系统的过程。值得注意的是,我们的重点是在不依赖LangChain或Llama索引的情况下实现这一点;相反&#xff…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发,涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统,以进行复杂的机器人实验,并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…

NC--介绍-未加密加密后-流量抓包对比

免责声明:本节仅做技术交流与学习... 目录 介绍: 用法: 未加密--流量抓包 加密: 攻击端 靶机 抓包分析: 介绍: nc 是一个Linux环境下常用的工具命令,可以用来帮助开发者查询和解决网路问题,通常被认为是 NetCat 工具的缩写,在网络工具…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

MySQL理解-下载-安装

MySQL理解: mysql:是一种关系型数据库管理系统。 下载: 进入官网MySQLhttps://www.mysql.com/ 找到download 滑动到最下方:有一个开源社区版的链接地址: 然后就下载完成了 安装: 双击: 一直next 一直next这一步&…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出:你好,仓颉…

ESP32-S3方案应用设备无线交互技术,产品远程控制与语音交互

在物联网和人工智能(AI)技术融合的浪潮中,ESP32-S3芯片以其卓越的性能和多功能性,成为智能家居和工业自动化领域的明星产品。 ESP32-S3是一款基于Xtensa LX6处理器的嵌入式系统级芯片,具有高效、低功耗的特点。集成的Wi-Fi和蓝牙功能&#x…

三大交易所全面恢复 IPO 申请

6月21日晚间,北交所受理了3家企业的IPO申请,这是北交所时隔3个月之后恢复IPO受理。6月20日晚间,沪深交易所各受理了1家IPO申请,这是沪深交易所时隔半年后再次受理IPO。这也意味着,三大交易所IPO受理全部恢复。 6月21日…

致敬企业家精神:比亚迪仰望发布“旷野宣言”

近年来,随着汽车在中国的普及,钟爱越野和探险的车主群体也在飞速发展壮大。 那么问题就来了:为什么会有这么多的人们钟爱越野和探险?越野精神究竟是什么? 作为备受关注的硬派越野车,比亚迪旗下的高端品牌仰…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字,英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C++基础编程100题-013 OpenJudge-1.3-11 计算浮点数相除的余数

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/11/ 描述 计算两个双精度浮点数a和b的相除的余数&#xff0c;a和b都是正数的。这里余数&#xff08;r&#xff09;的定义是&#xff1a;a k * b r&#xff0c;其中 k是整数&#xff0c; 0 < r < b。…

Spring Boot 快速入门4 ——JSR-303 数据校验

目录 一、前言 二、JSR303 简介 三、使用方法 常用注解 Validated、Valid区别 四、编写测试代码&#xff1a; 1. 实体类添加校验 2. 统一返回类型 3. 测试类 4.我们把异常返回给页面 5.抽离全局异常处理 2. 书写ExceptionControllerAdvice 一、前言 我们在日常开发…

鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】

分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力&#xff0c;包括业务流程跟踪的启动、结束、信息埋点等能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import hi…

小鹏MONA M03实车曝光

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 小鹏汽车 MONA 系列首款车型已经官宣命名为“M03”&#xff0c;预计将于今年第三季度上市。 现在&#xff0c;这款新车的实车照片已经在网上流传开来。 此次曝光的是一款米色车漆版本&#xff0c;与当…

Twinkle Tray:屏幕亮度控制更智能

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Twinkle Tray2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你打开…

【linux kernel】一文总结linux输入子系统

文章目录 一、导读二、重要数据数据结构&#xff08;2-1&#xff09;struct input_dev&#xff08;2-2&#xff09;input_dev_list和input_handler_list&#xff08;2-3&#xff09;struct input_handler 三、input核心的初始化四、常用API五、输入设备驱动开发总结(1)查看输入…