首页 > 其他分享 >指针入门讲解

指针入门讲解

时间:2024-10-27 21:20:09浏览次数:6  
标签:字节 int 地址 pa 讲解 指针 我们 入门

一.指针的定义

1.引入

     1.指针是内存中一个最小单元的编号,也就是地址

     2.平时我们口头中说的指针是指指针变量

     总结:指针就是地址,口语中说的指针是指指针变量。

内存地址
一个字节0xFFFFFFFF
一个字节0xFFFFFFFE
............
一个字节0x00000000

     如表中所示,一个小方框就代表一个内存单元,程序运行的时候会加载到内存中,也会使用内存空间。

     假如我们需要从内存中找到某个元素,就只需要获取它的地址,从而远程操纵这个数。

在此我们引出一个熟悉的符号‘&’(取地址运算符),如&a — 就是取出a的地址,且取出的是第一个字节的地址(较小的地址)。

2.指针变量

      1.指针变量定义:指针变量是一种变量,用来专门存放地址。

      经过上文论述,我们现在把a的地址赋给pa,即pa = *a;则pa就是指针变量

 如果a是int型,则pa是int型指针,记作int* pa = &a;

3.深入理解

1a630ab742a0439783b3ccce2396c32b.png

     如图,两种输出的输出结果都是一样的。

     如果我们想通过a的地址来操控a则只需引用*pa,此时*pa就操控了pa,此操作称为解引用

*’被称为指针运算符,假如我想将a的值改为20,则仅需以下操作,如图所示:

8d97db367fd4442d93185ea051bec1c7.png

4.总结

1° 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。

2° 指针的大小在32位平台是四个字节,在64位平台是8个字节。  

二.指针类型

1.思考  

     上文中我们提到了在某些平台中指针被分配的内存一般是4或8个字节,既然被分配的内存已经定下来,那么定义指针类型的意义是什么呢?为什么不能用一个通用的类型来统一指针?

     此问题将会贯穿本章节。

2.对指针类型的深入理解

     我们不妨从下面的代码中来体会:

     如图,我们创建一个整型变量a,初始化为一个十六进制的数。并对其进行取地址操作,创建一个指针变量pa用来存放a的地址。

5c6485d14f784df697a6503d00922710.png

      我们在内存中找到a所占的内存,如下图所示。(关于这里为什么a的字节是倒序排列保存本章暂且不做论述。)

2ed9b3944c124183a24a74c446ae2b5a.png

      接下来我们进行调试,通过对*pa赋值为零我们可以看到a的值已经变为零。

d1e514b4d8a04dafad5331ec8e676f11.png

那如果我们用一个char型指针来改变a会发生什么呢?如下图所示:我们通过强制类型转换,将int型指针pa变为char型指针pc,但我们将其赋值为零,但却只将它第一个字节改为00,后面三个字节并没有改变。

61f9115a74104d99b7dd1690651f9cae.png

      由此我们可以大概瞥见端倪,我们不妨多做几次指针类型不同的实验就可以轻易得出以下结论:

指针类型其实是有意义的:不同类型的指针类型决定了在解引用操作时一次性访问几个字节,如:如果是char*型指针,则一次性访问1个字节; 

如果是int型指针,则一次性访问4个字节;

如果是float型指针,则一次性访问4个字节;

如果是double型指针,则一次性访问8个字节...... 

读到这里,有些好奇的同学就要问了:

int和float类型指针都是一次性访问4个字节,那他们之间就可以相互替代了吗?我们不妨再来做一个实验,如下图所示:

d85cc85df55044a28d96c27de4312866.png

输出结果如下图所示:

4ae67a71db4d4dd58a7ff4c117f24814.png   

可以发现,float型指针变量并不能和int型指针变量相互混用,否则就会出现错误。

3.野指针

1.概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

2.出现原因:(1)指针未初始化.

(2)指针的越界访问

(3)指针指向的内存空间释放(此问本章暂且不做论述)

3.实例

两种情况依次如下图所示:

图2中当i>=5时,p指针就变为了野指针,越界访问数组。

4.如何正确的避免野指针:

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL(空指针,专门用来初始化指针)

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

三.指针的关系运算

1.指针+-整数的值

我们不妨来思考一下下图程序的输出结果是什么呢?

d7f6d28b28704f459202142f103ae0a6.png

通过上文对指针类型的深入理解,这里我们不妨大胆猜测一下:char*型指针+1,就加1个字节;int*型指针+1,就加4个字节,以此类推,我们来看一下输出结果:

f5fe9e415ff24c97abd71c590da1d9b7.png

我们分别定义了char*的pc和int*型的pi两个指针型变量,从输出结果我们可以看到:char*型指针+1,跳过了一个字节,int*型指针+1,跳过了4个字节,足以证明我们的猜测是正确的。我们可以做出如下总结:

指针类型决定了指针的步长,如char*型+1跳过一个字节,int*型+1跳过4个字节......

2.指针-指针

1.前提:两个指针要指向同一块空间

通过上文我们对指针整数运算的认识,我们思考一下指针与指针的减法又是什么样的呢?

我们做个实验来一探究竟:

由实验我们可以知道,指针与指针相减得到的其实是两个指针之间的元素个数的绝对值。

我们由此可以在将我们求字符串长度的函数改进一下:

我们之前的函数是这样写的:

我们学了指针就可以用如下形式表示:

如图所示,我们通过指针-指针的形式算出了字符串的个数。


如有错误,恳请指正。

标签:字节,int,地址,pa,讲解,指针,我们,入门
From: https://blog.csdn.net/Poeir_/article/details/143134781

相关文章

  • Harmonyg环境使用ORM开发数据库应用入门教程
    Harmony环境使用Bee入门向导一、添加jar包将bee相关的3个jar包复制到entry包下的libs目录,右击jar包,选择:AddasLibray… , 在跳出的对话框中选择ok.二、将相关配置注册到Bee在启动的Ability,添加相应的配置和注册信息。 若有自定义的配置在bee.properties则需要;......
  • Python基础入门——Python数据结构
    前言1.List(列表)原理列表是一种有序的可变容器,可以存储任意类型的对象。它的主要操作包括索引、切片、添加、删除、修改元素等。列表中的元素在内存中是连续存储的(对于简单的对象,如整数、字符串等是这样,对于复杂对象可能涉及到引用的存储),这使得通过索引访问元素的速度非......
  • Java学习教程,从入门到精通,Java 运算符(9)
    1、Java运算符在Java编程语言中,运算符用于执行各种算术、比较、逻辑和位操作。下面是一篇关于Java运算符的详细介绍:Java运算符在Java编程语言中,运算符用于对变量和字面值进行各种操作。Java支持多种类型的运算符,包括算术运算符、比较运算符、逻辑运算符、位运算......
  • 红队知识学习入门(3)Shodan使用
    声明学习视频来自B站UP主泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负一、shodansearch和host语法1、host2、searchshodansearch--limit10--fieldsip_str,port......
  • Python装饰器 - 具体讲解
    Python装饰器是一种非常有用的功能,它允许我们以不修改原有函数代码的方式,扩展或增强函数的行为。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。下面我将详细讲解Python装饰器的概念、用法和实现。1.装饰器的基本概念装饰器的基本语法如下:defdecor......
  • MySQL入门到实战详细教程
    MySQL介绍MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQLAB公司开发,属于Oracle旗下产品,它广泛应用于各种Web应用程序和网站,MySQL使用结构化查询语言(SQL)进行数据的管理和操作。MySQL主要特点开源免费:MySQL是一个开源项目,可以自由下载和使用。跨平台支持:MySQL可以在多......
  • 装饰器入门(总结) -4
    '''装饰器作用:<用来装饰其他函数的,即为其他函数添加特定功能的函数>装饰器函数的两个基本原则:1.装饰器不能修改被装饰函数的源码2.装饰器不能修改被装饰困数的调用方式关于第二点的说明:@timer等效于foo=timer(foo),事实上返回的是嵌套函数的view(引用):timer_calc......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。
       关于我我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力,我逐渐淡出了安全圈子,也没有继续学习技术。也因为这个原因,高考选择专业时......
  • ERP管理系统(源码+文档+部署+讲解)
    ERP管理系统、资源管理系统、业务流程管理系统、资源协同平台、决策支持系统、资源协同管理平台、资源规划与控制平台、资源信息管理系统、资源智能管理系统供应商本文将深入解析“ERP管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。系统概述ERP......
  • 物资管理系统(源码+文档+部署+讲解)
    物资管理系统、物料管理系统、物资采购管理系统、物资库存监控系统、物资分配优化系统、物资需求预测系统、物资成本控制系统、物资质量跟踪系统、物资供应协同平台、物资数据分析平台、物资智能调度系统供应商本文将深入解析“物资管理系统”的项目,探究其架构、功能以及技......