C语言指针的介绍1

news2024/11/17 0:08:42

在这里插入图片描述

前言

嗨,我是firdawn,本章将简单介绍,指针对应的实际意义,以及指针的简单使用和如何避免野指针,下面的图是本章的思维导图,那么,让我们开始吧!
在这里插入图片描述

一,内存和地址

1.1 程序运行是在计算机的内存中,而内存通常有8G,16G,那么,这么大的内存空间,计算机是如何管理的呢,原来啊,计算机会将内存划分为一个个小的内存单元进行管理,为每个内存单元分配一个地址,方便数据的查找,删除和存放,而一个内存单元大小是一个字节,相关单位换算如下图,而计算机底层,储存的其实是二进制的信息,也就是0和1组成的二进制序列,所以一个bite(比特)储存的是0或者1。
在这里插入图片描述

1.2 那么我们怎么在VS中查看数据在内存中的储存形式呢,我们可以先按F10进入调试窗口,打开VS的内存窗口,在内存搜索框中输入&相对应的变量就可以找到该变量了(&操作符下面我们会介绍,这里先不急),通过内存窗口,我们发现,因为我们要观察的int类型变量x是占4个字节的,所以图中这4个字节的空间存放的都是变量x的数据,由于内存中放的二进制序列展示出来不方便观察,所以会将其以十六进制的形式展示出来,而对于每个地址内的数据,两个十六进制的数字,代表队就是8个bit,也就是一个字节的数据
在这里插入图片描述
声明:内存单元的编号 == 地址 == 指针,通常我们口头上说的指针指的是指针变量,但是实际上,在书面表达中指针指的就是地址

二,指针变量和地址

2.1 我们已经知道了,对于每个内存单元都有其唯一的地址,那么如果我们定义了一个变量,该怎么得到他的地址呢,其实我们用&操作符就可以实现,假如这个变量是int类型,那我们将它的地址取出来放到指针变量里,这个变量的类型就是int * ,表示它是一个指针,int 表示这个指针指向的是一个int 类型的数据,那么如果我有一个char类型的数据,存放它的地址的指针变量的类型是什么呢,其实道理是一样的,它的类型为 char * , 表示它是一个指针,char 表示这个指针指向的对象为char 类型。如下图2.1-a
在这里插入图片描述

2.2 既然我们已经有了变量指针,那我们如何去使用它呢,通过解引用操作符 * ,就可以通过解引用指针找到对应的变量,如上图2.1-a ,pch中储存了字符变量ch的地址,而通过 *pch ,我们就可以找到ch,换句话说,*pch等价于ch,*px 等价于x。

三,指针变量类型的意义

3.1 对变量进行解引用 ( * ) 操作,得到的其实是其几个字节中最小的那一个地址,在32位平台中指针变量都是4个字节,在64平台中指针变量都是8个字节的大小,假设我们使用的是32位平台,那么,既然指针变量都是4个字节,都是用来储存地址的,我们为何不创造出一个统一的指针类型,它的大小是4个字节,它可以指向所有的变量,这样不是更省事吗,然而,我们对指针的类型进行了区分,为什么要这样做呢,原来,指针的类型,决定了我们对其解引用操作时,能够访问的空间大小,如果是char* 类型的指针,对其解引用,我们只能访问一个字节的空间,如果是int* 类型的指针,对其解引用,我们就能够访问4个字节大小的空间,指针的类型决定了不同的视野,站在不同的视野,它能够访问的空间大小就不同。如下图
在这里插入图片描述
在这里插入图片描述
3.2 指针除了能进行解引用操作( * )加减访问对应的空间,还能够加减整数,如果 pa是一个int* 类型的指针,那么,pa+1 跳过1个int类型的大小,一次跳过4个字节,指向后面的空间;如果pa是一个char* 类型的指针,那么,pa+1 跳过1个char类型的大小,一次跳过1个字节,指向后面的空间。
3.3 在指针类型中,有一种特殊的指针类型,就是 void* ,它能接收任意类型的变量的地址,但是不能进行解引用操作和指针加减整数的操作,因为不知道它指向的变量的类型,就不知道解引用操作时访问几个字节的空间或者指针加减整数操作时跳过几个字节,它一般用于函数中,当我们不知道要接收到是什么类型变量的地址时,就可以使用void* 来接收。

四,const修饰指针

4.1 当我们有一个指针变量,通过解引用指针我们可以修改对应的变量,如果我们不希望修改对应的变量,我们就可以用const 来修饰这个指针变量,例如:int x = 10; int const* px=&x;这里const放在 * 的左边修饰的是 *px ,那么 *px 就不能被修改,否则会报错,这是语法上的限制,如果我们是int * const px = &x;const放在 * 的右边,修饰的是px,那么px就不能被修改。

五,指针运算

5.1 既然我们有了指针,那么指针能进行哪些运算呢,首先,就是我们提到过的指针加减指数的计算,一个 int* 类型的指针,一次加减整数num,能跳过num个int 类型的大小,指向后面的空间。
5.2 其次,指针能够减指针,得到的是他们之间相差大元素的个数,需要注意的是,指针减指针,需要同一类型的指针进行加减才有意义,并且这两个指针要指向同一块空间。对于,指针加指针是没有实际意义的,就像对于日期,我们进行想减能得到相差的天数,但是日期想加,就没有意义了。
5.3 指针是可以用 > , < , ==,进行比较的,这时候,指针可以看作是一个数值,指针比较大小,进行的就是数值的比较。

六,野指针

6.1 我们在定义一个局部指针变量时,如果不对其初始化,它内部存放的就是随机的地址,这个指针指向的空间不是分配给我们的,我们不清楚这个空间上存放的数据的作用是什么,那我们就原则上不能对其进行修改,那么这个未初始化的指针就是野指针;再举个例子,如果我定义了数组arr[ 10 ],那么我们就不能访问arr[ 15 ]的数据,因为这块空间不是分配给我们的,如果我们访问了,就是数组的越界访问了,但是如果有一个指针,指向的是arr[ 15 ]的地址,那这个指针就是野指针,因为它指向的空间不是属于我的,我们是不能对其修改的。野指针就像一条野狗一样,它是非常危险的,如果一不小心访问了对应的空间,修改了数据,可能就会让计算机丢失数据,当然,计算机内有一些空间上的数据是不能修改的,我们对其进行修改可能就会报错。
6.2 既然野指针这么危险,我们有没有什么办法来解决它呢,其实是有办法的。
1.定义指针变量时同时对其初始化,给它赋值一个有效的地址,如果我们不知道要赋什么值的话,可以赋值NULL,也就是空指针,在cplusplus网站中我们可以知道,NULL其实就是void* 0 ,指向的就是0x00000000 这块空间,而这块空间,我们是无法对其修改的。在使用这个指针变量时,如果我们不确定它是否指向有效的空间,我们就可以对其进行是否为NULL的判断。这就像给指向无效空间的指针加了一个标签,方便我们辨认出,它是否指向有效的空间,这就比原来两眼一黑,无法辨认出这个指针是否指向有效空间好多了。
在这里插入图片描述

七,assert断⾔

7.1 如果一个指针为空指针 ,那他指向的就是无效的空间,我们是无法对这个空间上的数据进行修改的,否则电脑会报错,那么如果我们不知道一个指针是否是NULL,我们该怎么避免对NULL的解引用呢,我这时候可以使用assert,assert是一个库函数,使用它要包含头文件,用#include <assert.h> ,它的使用如下图
在这里插入图片描述

八,指针的使用和传址调用

8.1 学习了指针,那么我们讲一个使用指针的例子,strlen 的模拟实现,strlen 是一个库函数,可以计算一块连续的空间中’ \0 '之前的字符个数,具体可以参考cplusplus:strlen库函数介绍,代码如下图。
在这里插入图片描述
8.2 函数调用有两种,分为传值调用和传址调用,传值调用,传入的是变量的值,在被调用的函数中形参是实参的一份临时拷贝,改变形参不影响实参;传址调用,传入的是变量的地址,对该地址进行解引用 * 操作,能够找到该变量,可以改变实参。
在这里插入图片描述

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

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

相关文章

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码

使用 CapSolver API 服务解决 Arkose Labs FunCaptcha 验证码 FunCaptcha 以其复杂的图像验证而闻名&#xff0c;对自动化系统构成了巨大的挑战。CapSolver 的 API 服务利用先进的 AI 技术轻松应对和解决 FunCaptcha 挑战。本指南探讨了 CapSolver 如何实现无缝自动化&#xff…

基于SpringBoot的社区医院管理系统

基于SpringBootVue的社区医院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 医生预约 管理员界面 医生界面 摘要 基于Spring Boot的社区医院管理系…

如何通过IP地址来防范“杀猪盘”?

随着人工智能技术的逐渐成熟&#xff0c;给人们的生活带来了很多方面&#xff0c;但同时犯罪分子也紧跟“潮流”&#xff0c;据报道&#xff0c;以东南亚为主要地区的犯罪集团聚集地已开始使用人工智能聊天机器进行“杀猪盘”行动。这一现象导致国内诈骗案件持续发生&#xff0…

vue2好用的日期选择插件vue2-datepicker

中文文档&#xff1a;vue2-datepicker/README.zh-CN.md at master mengxiong10/vue2-datepicker GitHub npm下载地址&#xff1a; npm install vue2-datepicker --save 示例&#xff08;去除默认样式&#xff09; <style scoped> .datePicker{width: 15vw;backgrou…

用Sora等AI视频大模型赚钱的48种方式

不废话&#xff0c;直接上干货&#xff01; \1. 定制视频创作服务&#xff1a;为寻找在社交媒体平台上脱颖而出的企业和个人提供定制视频制作服务&#xff0c;或用于个人使用。根据特定主题或行业量身定制视频&#xff0c;例如旅行、教育或产品营销。 \2. **教育内容包&#…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量&#xff1a;echo %path% linux系统变量&#xff1a;echo $PATH2.引号 " " 双引号&#xff0c;换行…

centos ping: www.baidu.com: 未知的名称或服务

可以检查 /etc/sysconfig/network-scripts/ifcfg-ens33和/etc/resolv.conf这两个文件里面的内容&#xff1a; 这个就不多说了&#xff0c;可以看教程合集的000文档 还有一个原因就是路由网关没有配置&#xff1a; netstat -rn 如果GATEWAY这里没有显示你的网关信息&#xff08…

有道:一季度业绩超市场预期,生成式AI商业化落地进程加快

5月23日&#xff0c;教育科技公司网易有道&#xff08;NYSE&#xff1a;DAO&#xff09;公布了2024年第一季度未经审计的财务报告。报告期内&#xff0c;受益于“AI”加“教育”双轮驱动&#xff0c;业绩表现超市场预期&#xff0c;业务健康度大幅改善。 财报显示&#xff0c;…

体量小但增速快,国内OTA平台与国际巨头差在哪?

5月3日&#xff0c;Booking、Expedia等国际OTA平台相继发布2024年第一季度财报。5月21日&#xff0c;携程发布2024年第一季度财报。至此&#xff0c;国内外主要OTA平台一季度成绩单均已披露。 受益于全球旅游市场复苏&#xff0c;三家OTA平台一季度营收同比均正向增长。增长之…

Unity LayerMask避坑笔记

今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候&#xff0c;通过LayerMask.NameToLayer传入了int值的LayerMask&#xff0c;结果一直识别不到&#xff0c;经过Debug才找到问题&#xff0c;竟是LayerMask的“值”传输有问题&#xff0c;记录一下。 直接贴代码输出结果&…

最大负载1kg!高度模块化设计!大象机器人智能遥控操作机械臂组合myArm MC

引入 近年来&#xff0c;市面上涌现了许多类似于斯坦福大学的 Alopha 机器人项目&#xff0c;这些项目主要通过模仿人类的运动轨迹来进行学习&#xff0c;实现了仿人类的人工智能。Alopha 机器人通过先进的算法和传感技术&#xff0c;能够精确复制人类的动作&#xff0c;并从中…

ViLT学习

多模态里程碑式的文章&#xff0c;总结了四种多模态方法&#xff0c;根据文字和图像特征特征抽取方式不通。 文章的贡献主要是速度提高了&#xff0c;使用了数据增强&#xff0c;文本的mask 学习自b站朱老师的论文讲解

搭建电商电子商务平台有哪些好用的电商API数据采集接口?

电商API接口主要用于帮助开发者将电商功能集成到自己的应用程序中&#xff0c;实现诸如商品检索、商品价格数据获取、订单处理、支付、物流跟踪等功能。以下是一些常用的电商API接口提供商&#xff1a; 主流电商平台API&#xff1a; 淘宝开放平台&#xff1a;提供淘宝、天猫、…

网络安全架构之零信任安全

网络安全架构之零信任安全 文章目录 网络安全架构之零信任安全零信任安全时代背景安全世界“新旧时代”各种攻击风险层出不穷网络安全边界逐渐瓦解内外部威胁愈演愈烈 零信任架构零信任的理念在不可信的网络环境下重建信任构建自适应内生安全机制以身份为基石业务安全访问持续信…

智能禁区监控:计算机视觉在人员禁区闯入检测中的应用

基于视觉分析的人员禁区闯入行为检测算法主要依赖于计算机视觉技术和深度学习算法。这些技术结合高性能的摄像头和图像处理硬件&#xff0c;实现了对监控区域内人员行为的自动识别和分析。具体来说&#xff0c;这种检测算法利用摄像头捕捉的视频数据&#xff0c;通过深度学习模…

倍思科技获14项红点设计奖,引领中国移动数码品牌创新风潮

近日,国际红点设计大奖公布了2024年获奖名单,中国移动数码品牌倍思科技凭借其出色的产品设计实力,一举斩获14项红点设计奖。这些获奖产品涵盖了充电、音频、车用等多个品类,展现了倍思科技在创新设计和实用功能方面的卓越成就。 红点设计奖作为世界知名设计竞赛,素有“设计界的…

采用Java语言开发的(云HIS医院系统源码+1+N模式,支撑运营,管理,决策多位一体)

采用Java语言开发的&#xff08;云HIS医院系统源码1N模式&#xff0c;支撑运营&#xff0c;管理&#xff0c;决策多位一体&#xff09; 是不是网页形式【B/S架构]才是云计算服务? 这是典型的误区! 只要符合上述描述的互联网服务都是云计算服务&#xff0c;并没有规定是网页…

DelayQueue原理分析

1.简介 DelayQueue同样也是适用于并发环境下的容器之一&#xff0c;该容器属于阻塞队列的一种&#xff0c;其底层数据结构是PriorityQueue&#xff0c;主要应用于执行定时任务和缓存过期删除的场景。 DelayQueue也是线程安全的&#xff0c;它通过内部的ReentrantLock实现了线程…

error1310 写入文件时发生错误,请确认您是否有访问权限 也可能出现error 1304 :写入文件时出错

一般错误提示如下 error1310 Error writing to file 错误 1310 &#xff1a;写入文件时出错&#xff1a;请确认您有权访问该目录&#xff0c; error1304 Error writing to file 错误 1304 &#xff1a;写入文件时出错&#xff1a;请确认您有权访问该目录 1.首先我们退出所…