自学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.rhkb.cn/news/359799.html

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

相关文章

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Springboot开发Webservice服务端和客户端

环境说明 Java JDK 1.8、Spring boot 2.1.6、Apache CXF 3.1.6 POM依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.6</version&…

Facebook与地方文化:数字平台的多元表达

在当今数字化时代&#xff0c;社交媒体不仅仅是人们交流的工具&#xff0c;更是促进地方文化传播和表达的重要平台。作为全球最大的社交网络之一&#xff0c;Facebook在连接世界各地用户的同时&#xff0c;也成为了地方文化多元表达的重要舞台。本文将深入探讨Facebook如何通过…

【MySQL】数据库——事务

一.事务概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行事务是一个不可分割的工作逻辑单元&#xff0c;在数…

【漏洞复现】脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大&#xff0c;运行稳定&#xff0c;操作简单方便&#xff0c;用户界面美观&#xff0c;轻松统计数据的一脸通系统。无需安装&#xff0c;只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备…

git clone自己的私有仓库

大家好&#xff0c;今天来教大家一个简单实用的操作——如何在自己的电脑上git clone自己的私有仓库。无论是工作还是学习&#xff0c;我们都可能会用到GitHub这样的代码托管平台来管理我们的项目&#xff0c;那么如何快速、安全地将这些项目下载到本地呢&#xff1f;下面就是详…

Web服务器与Apache(LAMP架构+搭建论坛)

一、Web基础 1.HTML概述 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语音,用于创建和组织Web页面的结构和内容&#xff0c;HTML是构建Web页面的基础&#xff0c;定义了页面的结构和内容&#xff0c;通过标记和元素来实现 2.HTML文件结构 <html>…

Zoho邮箱怎么注册?最强完整指南

Zoho企业邮箱&#xff0c;凭借其16年的产品历程和卓越的服务品质&#xff0c;已经成为全球超过1800万企业级客户的信赖之选。今天&#xff0c;我们将手把手教你如何注册Zoho邮箱。 一、Zoho邮箱是什么&#xff1f; Zoho邮箱是Zoho Workplace套件中的核心产品&#xff0c;专门…

Redis数据库的删除和安装

Redis数据库的删除和安装 1、删除Redis数据库2、下载Redis数据库 1、删除Redis数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过Redis数据库&#xff0c;要更换版本的话&#xff0c;其实Redis数据库的删除是比较简单的&#xff0c;打开我…

常见加密方式:MD5、DES/AES、RSA、Base64

16/32位的数据&#xff0c;最有可能就是使用md5加密的 使用对称加密的时候&#xff0c;双方使用相同的私钥 私钥&#xff1a;单独请求/隐藏在前端的隐藏标签当中 二、RSA非对称密钥加密 公钥加密&#xff0c;私钥解密 私钥是通过公钥计算生成的 加密解密算法都在js源文件当…

数电大作业-四输入表决器

&#xff08;PCB和multisim仿真画的有很大问题&#xff0c;没有VCC输入和GND&#xff0c;没学过直接裸画的&#xff0c;之后会好好看视频学习&#xff09; 应用背景&#xff1a; 四个评委&#xff0c;三个及以上评委同时按下通过按钮时&#xff0c;选手才能通过。否则不通过。…

微信小程序 引入MiniProgram Design失败

这tm MiniProgramDesign 是我用过最垃圾的框架没有之一 我按照官网的指示安装居然能安装不成功,牛! 这里说明我是用js开发的 到以上步骤没有报错什么都没有,然后在引入组件的时候报错 Component is not found in path “./miniprogram _npm/vant/weapp/button/index” (using…

20240507-招商证券 基于鳄鱼线的指数择时及轮动策略

动量震荡指标构造 动量震荡指标为交易者提供了获利的钥匙。动量震荡指标测算了5根价格柱相对于34根价格柱的动量变化。首先计算最近5根价格柱的最高价和最低价间的中点的简单移动平均值&#xff0c;即(最高价最低价)12的简单移动平均&#xff0c;将得出的值减去最近34根价格柱…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

MES管理系统中的仓库管理功能有哪些用途

在当今制造业迅猛发展的背景下&#xff0c;企业对于车间生产调度的需求日益迫切。为此&#xff0c;MES管理系统应运而生&#xff0c;它作为一款专注于车间生产调度的管理信息系统&#xff0c;正逐步成为制造业提升生产效率、优化资源配置的利器。特别是其在仓储和物流管理方面的…

封装了一个优雅的iOS转场动画

效果图 代码 // // LBTransition.m // LBWaterFallLayout_Example // // Created by mac on 2024/6/16. // Copyright © 2024 liuboliu. All rights reserved. //#import "LBTransition.h"interface LBPushAnimation:NSObject<UIViewControllerAnimated…

Pikachu靶场--文件上传

参考借鉴 Pikachu靶场之文件上传漏洞详解_皮卡丘文件上传漏洞-CSDN博客 文件上传漏洞&#xff1a;pikachu靶场中的文件上传漏洞通关_pikachu文件上传通关-CSDN博客 client check 在桌面新建一个文件夹&#xff0c;准备一个hello.php文件&#xff0c;文件写入如下代码 <?p…

0803功放3

1.甲乙类互补堆成功放&#xff0c; 理想12v t提供静态偏置&#xff0c;消去交越失真 2.12V Po(12)2/2RL 3.电压并联负反馈 并联减小输入电阻 电压减小输出电阻 4.-Rf/Ri 这个问题是工艺问题引起的&#xff0c;最早用PNP管用的锗管&#xff0c;后面硅工艺成熟后用的就是硅管&…

【刷题篇】链表

文章目录 1、两数相加2、两两交换链表中的节点3、 重排链表4、 合并 K 个升序链表5、 K 个一组翻转链表 1、两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数…

Ubuntu系统使用快速入门实践(八)—— git 命令使用

Ubuntu系统使用快速入门实践系列文章 下面是Ubuntu系统使用系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 Ubuntu系统使用快速入门实践系列文章总链接 下面是专栏地址&#xff1a; Ubuntu系统使用快速入门实践系列文章专栏 文章目录 Ubuntu系统使用快速…