指针与地址
在程序运行中,系统会自动根据变量的大小分配对应的内存空间,内存空间的标准单位是字节,而每个字节都有自己的编号,就像一个大学会给每位学生分配学号,而学号就相当于这个学生的编号,这个编号就称为地址(或指针)。
ps:严格意义上来讲,指针和地址是一个概念,但是在口语中,我们通常将“指针”表示为指针变量(下文会介绍)
地址的数据类型
整形数据的地址数据类型 --------------------->int *
浮点型数据的地址数据类型 --------------------->float*
字符型数据的地址数据类型 --------------------->char*
ps:这里拿int float char举例,并不只有这三种类型,还有long*,double*等等
*与&
*称为解引用符,&称为取地址符。拿前面所举的例子来说,&符的作用就是查到所想找的学生的学号,*符的作用相当于查询修改的作用,可以从该学生的学号中查询和修改他的基本个人信息。
指针变量
指针变量是一种专门存放地址的变量,就跟整型变量专门存放整形数据一个道理,在32位机器下,所有指针变量的内存大小都为4个字节,在64为机器下,所有指针变量内存都为8个字节
通用格式为:
地址的数据类型+变量名=地址;
这里就有两个问题需要仔细思考一下
为什么指针变量都为4(8)个字节大小?这和32位、64位有什么关系?
为什么指针大小都相同,却还分(int*)(float*)(char*)等等?
为什么指针变量都为4(8)个字节大小?这和32位、64位有什么关系?
以32位机器举例,指针变量存的是地址,而地址是通过机器的地址线发出的电信号来表示,32位机器有32根地址线,每根地址线可以通过电信号(高、低电频)转换出地址(高电频对应1,低电频对应0),所以一个地址由32个比特位(4个字节)来表示,所以在32位机器上每个指针变量都为4个字节大小,64位机器也是同理,所以在64位机器上指针变量大小为8个字节
为什么指针大小都相同,却还分(int*)(float*)(char*)等等?
1.指针类型决定解应用一次性访问几个字节
int类型的大小为4个字节,所以int*的指针一次性只访问4个字节,char*类型的指针一次性只访问1个字节,float*类型的指针一次性访问4个字节
ps:下图拿char*举例
2.指针类型决定指针+1跳过几个字节
int类型占4个字节,int*类型的指针+1就会跳过4个字节,char类型占1个字节,char*类型则会跳过1个字节,其他指针类型以此类推。
ps:下图拿int*类型举例
指针运算
①指针+或-整数
指针+-整数--->指针向前走(或后退)n个字节
ps:n由指针类型所决定,上文已详细说明
②指针-指针
前提条件:两个指针要指向同一空间
|指针-指针|=两个指针之间的元素个数
③指针关系运算:高地址与低地址的比较
二级指针
一级指针变量存储的是数据地址
二级指针变量存储的是一级指针的地址,数据类型为int**,char**,float**等等
野指针:
指向位置不可知的(随机的、不正确的、没有明确限制的)的指针变量
什么原因会导致野指针的出现
①指针未初始化,导致指针指向的位置不可知
②指针越界,通俗讲就是对一些超出了系统分配的空间进行访问修改,这种问题容易出现在数组是上
ps:下图以数组举例
对分配好的数组空间进行越界访问修改,就是典型的指针越界
③:指针指向的空间被释放了
防止野指针的注意事项
1.定义指针时记得初始化
2.弄清楚数据的内存空间,防止指针越界
3.指针指向的空间释放后及时置NULL,使其成为空指针。
ps:空指针:指向NULL的指针为空指针,类型为void*
结语:
以上就是我分享的全部内容了,指针作为C语言中的重点特色,熟练掌握初阶指针知识对后面学习进阶指针、数据结构、C++等等都大有裨益,希望对大家有些帮助,也希望与一样喜欢编程的朋友们共进步
谢谢观看
如果觉得还阔以的话,三连一下,以后会持续更新的,我会加油的
若有错误和不足,欢迎各位读者前来指正
祝大家早安午安晚安