指针的理解(1)

1.首先我们得先了解一下内存和地址,我们知道计算机上cpu在处理数据的时候,需要的数据是在内存中途取的,读取后的数据也会放回内存中,电脑上内存是8GB/16GBb/36GB。在内存中,我们常常把内存划分为一个个的内存单元,每个内存单元的大小取一字节。而。每个内存单元都有一个编号这个编号也称为地址,在c语言中,给弟子起了新的名字叫指针。也就是说:内存单元的编号=地址=指针。

2.指针变量:指针变量也是一种变量,这种变量就是用来存放地址的存放在指针变量中的值都会理解为地址。

3.解引用操作符:当我们拿到了一个地址,就可以通过地址找到地址指向的对象,这里需要用到一个操作符,叫做解引用操作符(*)

d0707fd9cf914e0186337cd9d3e272cd.png

 在这个代码中,*pa的意思就是通过pa中存放的地址找到指向的空间。*pa其实就是a变量了,所以*pa=0 。

4.指针变量的大小:32个机器假设有32根地址,总线每根地址线出来的电信号转化成数字信号后是0或者1。那我们把32根地址线产生的二进制序列当做一个地址,那么一个地址就是32个bit需要4个字节才能存储,同理64位机器假设有64根地址线,一个地址就是64个二进制位。组成的二进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节。

1d2621e567a2408e89d858baaf576f26.png

 5.指针变量类型的意义:指针的类型决定了对指针解引用的时候有多大的权限,一次能操作几个字节。比如char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问4个字节。

6.void*指针:可以理解为无具体类型的指针或者叫泛型指针,这种类型的指针可以用来接受任意类型地址,但也有局限,void*类型指针。不能直接进行指针的加、减整数和解引用的运算。

7.const修饰变量:变量是可以修改的,如果把变量的地址交给一个指针变量,通过指针变量也可以修改这个变量,但是如果我们希望一个变量加上一些限制不能被修改,这时我们就可以用const。

019c410833f94d428815353f1daedf95.png

 8.const修饰指针变量:一般来讲,const修饰指针变量可以放在*的左边,也可以放在*的右边,意义是不一样的。 const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量本身的内容可变。 const如果放在*的右边,修饰的是指针,变量本身保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

9.野指针:就是指针指向的位置是不可知的或是随机的、不正确的、没有明确限制的。野指针成因有三个,(1)指针未初始化(2)指针越界访问(3)指针指向的空释放

10.如何避免野指针:(1)如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULL,NULL是c语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错(2)小心指针越界,一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间不能超出范围访问。超出的就是越界访问。

(3)指针变量不在使用时及时置NULL指针使用之前检查有效性。

11.指针的传址调用和传值调用:

28799cb9251646478f914b2976dc953c.png

 Swap1函数在使用的时候是把变量本身直接传递给了函数,这种调用函数的方式我们称为传值调用,实参传递给行参的时候,形参会单独创建一份临时空间来接收实参。对形参的修改不影响实参。

75ca0a10aa51482aa4bb5e87f1529815.png

 这里调用的Swap2函数的时候是将变量的地址传递给了函数,这种函数调用的方式叫传址调用,传址调用可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量,所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用,如果函数内部要修改主调函数中的变量的值,就需要传址调用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值