深入学习指针1

一:指针的定义

  1-1:简单来说,我们的内存是可以被切分成一个个内存单元的,对于计算机为32位的,其每个内存单元的大小是四个字节,也就是八个比特位,而目前经常使用的是62位,对应的每个内存单元就是八个字节,可以存取的数据更加多了。而每个内存单元都有自己的编号,以便于计算机想要调用它时,可以快速的拿到。举个生活中的例子,我们居住的房间或是公寓其都有自己的门牌号,但你有朋友来找你的时候,你可以把自己的门牌号告诉他,他就可以很高效的找到你,同理,在内存中,也是如此,但你想要访问一个特定内存的内容时,你可以通过它的内存编号来找到它,而这个内存编号又被称为地址,地址其实就是指针。(内存单元的编号==地址==指针)

  1-2:理解编址

 

2.指针变量与地址

2-1 取地址符号(&)

ps:&,此也可以表示按位与

int a=10;

int*p = &a;  其中的&,表示其向计算机声明其要取出a这个整型的地址

2-2 指针变量(类型*)

指针变量就是为存储指针的,用来存放所取得的地址

例如:

指针类型除了有int*,还有char*,double*...

2-3 解引用操作符(*n)

解引用操作符,其实就是为通过指针变量里面放置的指针(地址)来找到对应数据的内存,然后将其里面的内容进行更改。

例如

2-4 void*指针

定义:其指的是无具体类型的指针,所以但你在写代码时,你并不确定一个指针的类型要设为什么时,就可以了利用void*类型的指针,但是其局限性在于其无法进行指针的加减运算还有解引用。

这里可以看到,在给pa解引用时,编译器报错,在对pa进行加和时,编译器也报错。

3.const修饰的指针

(理解:const修饰的变量被称为常变量,其本质上仍然为变量,但是在利用const修饰后,其数值时无法更改的),接下来,来介绍一下两种类型的const修饰指针的类型

3-1 把const放置在了*pa前面

此中,我们把const添加在了*pa前面,但我们先要理解一下什么是*pa,pa

而const修饰在 *pa前面,其表示的意思就是把pa通往空间a的通道给封死,让pa无法通过此通道来改变a内部的数据,所以,当下面你要通过*pa来改变a的数值时,其实会报错的,但是其并没有把pa给封死,pa仍然可以和其他空间内存建立联系,例如写成int b=2;pa=&b;编译器是不会报错的。

3-2 把const放置在pa前面

当把const放置在了pa前面的时候,其相当于就是锁定住了pa,不让其改变pa内部存储的内容,所以当你写pa=&b;时,编译器会报错,但是其并没有封死住pa与a之间的连接通道,所以可以通过解引用来改变a内部的内容。(即*pa=10;编译器不会报错)

4.指针的运算

4-1指针减去指针,表示的为地址减去地址,得到的为指针与指针之间的元素个数

例如:

此中,将首元素的地址与末元素的地址进行相减,得到的就为两个元素之间的而元素个数

4-2指针的关系运算--可以利用指针来作为if或是while的判断条件

例如

5.野指针

5-1:未对指针进行初始化,而野指针的位置就是不确定的,随机的,也就会占用到其他的内存空间中,如果再利用上解引用,就属于非法访问了

5-2:对于越界访问,比如一个只包含十个元素的数组,你硬是往里面塞了12个元素,之后,你要对其数组中的每个元素进行地址提取,最后的两个就是属于越界,然后会存在非法访问。

5-3:对于空间释放后,又去访问的,也是非法。

6.assert断言

定义与作用:在assert.h头文件中定义了宏assert(),用于在运行的时候确保程序符合指定条件,若不符合就会终止程序并报错,而这个宏常被称为断言。

举个例子:

其可以放在一个函数中,其表达的是若这个指针里面的内容不为空指针(既有进行初始化等操作),就会返回真,而程序正常运行下去,若为空指针,则会返回假,程序会被终止,然后编译器报错。

7.指针的使用与传址调用

首先,我们来回顾一下之前一直在使用的传值调用:

函数得到的x与y的值,是通过实参a与b传输过去的,这个是传值调用。

那么传址调用,顾名思义,就是把实参的地址传输给形参,让形参变量里面存储的内容是地址,从而可以通过调用这个地址来找到或更改实参里面的内容。

那么,我们来看一些例子,从而可以更加深入的理解指针的重要性与好处。

例1:利用函数来实现数字的交换

此处利用传值交换,但是发现结果不对,这是因为传值调用,其中实参与形参所占据的内存空间是不同的,在实参将数据传递给形参后,形参通过函数内部的算法得到一个结果,但是这个结果仍然是放在形参的内存空间中,并没有传递给实参,而形参在函数调用完后就被销毁,回到main函数中,其结果仍旧不会改变。因此,才引入了传址调用。

通过传址调用,就可以轻松解决问题,那么,为什么会这样呢?因为,传址调用,就是通过向函数传入地址,而形参就要相应的变为指针变量,来接受地址,然后通过解引用来找到实参的空间,直接将其内部的值进行更变。

目前只是讲到了指针的一些简单使用,后续还会有数组指针,函数指针等内容。

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和煦的糖果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值