初识指针 1.0


前言

各位宝子们,想象一下你家的信箱。信箱里装着各种信件和包裹,每个信箱都有一个唯一的地址。现在,你手里拿着一张纸条,上面写着某个信箱的地址。这张纸条就像是指针,它并不是信件本身,而是告诉你在哪里可以找到这个信件。

在计算机编程中,变量就像是那些放在信箱里的信件或包裹,而指针则是用来指向这些变量的地址的东西。通过指针,我们可以找到并操作这些变量,就像你用地址纸条找到并取出对应的信件一样。


一、指针的组成

指针其实是一个地址,它是内存单元的一个编号。

由上面的代码,我们可以看到指针是由四个部分组成的,我们可以以 int* p=&a 这个代码为例子。

*表示p是一个指针变量,int表示这个指针变量所指向的内容是个整型类型,p则是这个指针变量的名字,&这是用来取指针所指向内容的地址。

* 在计算机中有好几种说法:在a*b中,*表示的是四则运算中的乘法运算;而在指针中*p,*叫做解引用操作符,它的作用顾名思义就是将指针(地址)解放再引用,*p这时候是一个数值。

&在计算机中同样有好几种说法:在a&b中,&表示的是按位操作符中的按位与即在对应的二进制中两个中只要有一个0就为0,只有两种都为1才为1;而在指针中,&a表示的是取出a的地址,然后再赋值给指针。

注意:p==&a(它们是一个地址);*p==a(它们是一个值);&p是一个地址,它表示的是a的地址的地址

二、指针的意义

1.指针变量中数据类型的意义

*是通过地址(指针)找到地址所指向的对象。而*前面修饰的数据类型不同,*发挥的作用也是有所不同的。我们根据前面所学的知识应该都知道了每种数据类型在内存中所占的字节数都是不同的:例如int在内存中中占4个字节数,char在内存中只占1个字节数,故当指针+-某个数字时,它会根据前面的数据类型,前进或者后退多少个字节数;除此之外,数据类型还决定了解引用操作符(*)的权限(一次能操作几个字节)

ps:%p是用来输出地址的占位符,在内存中地址是以16进制存储的

除了一些基本的数据类型(int,char,flaot,double....)还有void*指针,这是一种特殊的指针,它是一个无具体类型的指针(也叫泛型指针),这种类型的指针可以用来接收任意类型地址。但是它也有局限性,void*类型的指针不能直接进行指针的+-整数和解引用操作。

2.指针变量大小意义

我们前面已经知道,指针是一个地址,指针也分为各种类型,那么它们的大小将如何判断呢?难道是根据前面的数据类型来判读吗?NO,NO,NO这时候咱们就太死板了,其实指针变量的大小与它的类型无关,而是跟它的环境有关


三、指针的运算

1·指针+-整数

我们知道数组在内存中是连续存放的,故只要知道第一个元素的地址,顺藤摸瓜就能找到后面所有的元素

其中 p+i是跳过i*sizeof(数据类型)个字节

2·指针-指针

指针-指针的绝对值是指针和指针之间元素的个数(注意仅指的是个数,而不是字节数),但是指针-指针还有一个前提条件就是两个指针必循指向同一个内存空间。下面我们可以来通过一个例子来进一步了解一下。

3·指针的关系运算

其实指针也可以像数字那样进行关系运算,但是两个指针要相同类型噢,例如下面的例子

四、野指针

首先让我们了解一下,何为野指针?野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

1.野指针的成因

1.1指针未初始化

1.2指针越界访问

1.3指针指向的空间释放

2.如何规避野指针

2.1指针初始化

如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULL。NULL是C语言中定义的一个标识符常量,值是0,0也是地址,但是这个地址是无法使用的,读写该地址会发生报错

2.2小心指针访问过界

2.3避免返回局部变量的地址

由于局部变量一个只能在某个函数体内使用,之后可能会被释放掉,因此尽量避免返回局部变量的地址

五、const修饰指针变量和assert断言

一般来说const放在指针变量中*的左右两边意义是不同的。

在计算机编程中,assert 是一种常用的调试和错误检测工具,它用于在程序运行时检查一个条件是否为真。如果条件为假(即断言失败),assert 会导致程序终止,并在调试模式下显示出错信息,帮助开发人员找到问题所在。注意:在使用assert断言语句的时候不要忘记加上#include<assert.h>

  1. 断言的意义

    • 调试工具assert 主要用于在开发阶段检测程序中的逻辑错误和不合理的假设。
    • 提高代码可靠性:通过在关键位置添加断言,可以确保程序在运行时符合预期条件,减少因错误条件导致的异常行为或崩溃。
    • 快速定位问题:一旦断言失败,程序会立即中止,并显示具体的出错信息(例如断言所在的文件、行号等),帮助开发人员快速定位和修复问题

最后再补充一个指针的小运用:传址调用

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值