当前位置: 首页 > news >正文

C语言什么是指针? 什么是指针变量?

一、问题

        指针是 C 语⾔中的⼀个重要概念,也是 C 语⾔中的⼀个重要特⾊。它的身影在整个 C 语⾔体系中都会出现,⽽且其概念也⼗分复杂,需要多加注意和思考。

二、解答

        为了更好地弄清指针的概念,这⾥不得不先提到地址以及数据在内存中的存储和读取⽅式。

        如果在程序中定义了⼀个变量,在对程序进⾏编译的时候,系统就会给这个变量分配内存单元,但是这个单元的⼤⼩根据定义变量的类型不同⽽不同。

        衡量内存单元⼤⼩的单位是字节,⽽内存中的每个字节都有⼀个编号,这个编号就是地址。类似于现实⽣活中的旅馆,字节就相当于每个房间,字节编号就相当于旅馆的房间编号,那么客⼈就相当于存取的数据。对于内存地址的模拟如图 1 所示。

        图 1 中的 1000、1002 等就是内存单元的地址,⽽ 0、1 就是内存单元的内容。换种说法就是基本整型变量i在内存中的地址从1000 开始,因为基本整型占两个字节,所以变量 j 在内存中的起始地址从 1002 开始,变量 i 的内容是0。

        那么指针又是什么呢?这⾥仅将指针看作是内存中的⼀个地址。多数情况下,这个地址是内存中另⼀个变量的位置。如图 2 所示。

        在程序中定义了⼀个变量,进⾏编译时就会给这个变量在内存中分配⼀个地址,通过访问这个地址可以找到所需的变量,这个变量的地址称为该变量的“指针”。如图 2 所示,地址 1000 是变量i的指针。

        如果⼀个变量包含了另⼀个变量的地址,那么,第1个变量就可以说成是指向第2个变量。所谓“指向”就是通过地址来体现的。因为指针变量是指向⼀个变量的地址,所以将⼀个变量的地址值赋给这个指针变量后,这个指针变量就“指向”了该变量。例如,将变量i的地址存放到指针变量p中,p 就指向 i 。其关系如图 3 所示。

        如图 4 所示,在地址 2000上的这个变量指向地址 2005 上的那个变量,在地址 2000上这个变量的内容的值是 2005。同理,在地址 2001上的这个变量指向地址 2004 上的那个变量,在地址2001 上这个变量的内容的值是 2004。

三、总结

        能够正确⽽灵活地运⽤C语⾔指针是⼀个成熟C语⾔程序员的标志之⼀。C语⾔指针可以有效地表⽰复杂的数据结构,能够动态地分配内存,⽅便字符串的使⽤,更好地操作数组,完成获取多个函数运⾏结果的任务。更重要的是,可以直接处理内存单元地址等。 总之,学好指针对C语⾔程序员很重要。

相关文章:

  • C++之STL整理(8)之stack用法(创建、赋值、增删查改)详解
  • 【Android】【root remount】【2】如何判断设备是否remount
  • 接口自动化测试(python+pytest+requests)
  • 工业视觉AI应用总结记录
  • AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火
  • String类(1)
  • 动手学习深度学习(李沐)
  • Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)
  • 前端使用minio传输文件
  • Java Set基础篇
  • Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程
  • 在unbuntu服务器上使用nginx+uwsgi部署django项目
  • 领鸡蛋游戏养鸡游戏淘宝客源码广告联盟
  • 活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践
  • docker 安装redis报错:can not init background jbos
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Android 控件背景颜色处理
  • AWS实战 - 利用IAM对S3做访问控制
  • golang 发送GET和POST示例
  • JS学习笔记——闭包
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React16时代,该用什么姿势写 React ?
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Web Storage相关
  • 给Prometheus造假数据的方法
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我看到的前端
  • 用Python写一份独特的元宵节祝福
  • 在Mac OS X上安装 Ruby运行环境
  • HanLP分词命名实体提取详解
  • UI设计初学者应该如何入门?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #define与typedef区别
  • #git 撤消对文件的更改
  • #Ubuntu(修改root信息)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (a /b)*c的值
  • (Ruby)Ubuntu12.04安装Rails环境
  • (六)软件测试分工
  • (一)Linux+Windows下安装ffmpeg
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .Net 8.0 新的变化
  • .net Application的目录
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net环境下的缓存技术介绍
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20170713] 无法访问SQL Server
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [ACM] hdu 1201 18岁生日