指针初阶知识

指针与地址

        在程序运行中,系统会自动根据变量的大小分配对应的内存空间,内存空间的标准单位是字节,而每个字节都有自己的编号,就像一个大学会给每位学生分配学号,而学号就相当于这个学生的编号,这个编号就称为地址(或指针)。

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++等等都大有裨益,希望对大家有些帮助,也希望与一样喜欢编程的朋友们共进步

        谢谢观看

        如果觉得还阔以的话,三连一下,以后会持续更新的,我会加油的

        若有错误和不足,欢迎各位读者前来指正

        祝大家早安午安晚安

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值