前言
各位宝子们,想象一下你家的信箱。信箱里装着各种信件和包裹,每个信箱都有一个唯一的地址。现在,你手里拿着一张纸条,上面写着某个信箱的地址。这张纸条就像是指针,它并不是信件本身,而是告诉你在哪里可以找到这个信件。
在计算机编程中,变量就像是那些放在信箱里的信件或包裹,而指针则是用来指向这些变量的地址的东西。通过指针,我们可以找到并操作这些变量,就像你用地址纸条找到并取出对应的信件一样。
一、指针的组成
指针其实是一个地址,它是内存单元的一个编号。
由上面的代码,我们可以看到指针是由四个部分组成的,我们可以以 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>
-
断言的意义:
- 调试工具:
assert
主要用于在开发阶段检测程序中的逻辑错误和不合理的假设。 - 提高代码可靠性:通过在关键位置添加断言,可以确保程序在运行时符合预期条件,减少因错误条件导致的异常行为或崩溃。
- 快速定位问题:一旦断言失败,程序会立即中止,并显示具体的出错信息(例如断言所在的文件、行号等),帮助开发人员快速定位和修复问题
- 调试工具:
最后再补充一个指针的小运用:传址调用
标签:1.0,变量,指向,数据类型,地址,初识,内存,指针 From: https://blog.csdn.net/H2X7_/article/details/140381250