超详细!!!深入了解指针(1)

假设你自己是个外卖员,有一天你接到一个单子,里面就只告诉你去哪里拿外卖,但是没有写自己的家庭住址,你哪了外卖往哪里送???

1.地址和指针

1.1指针

同样的如果你让计算机帮你改一个数据或者执行某种操作,但是没有告诉计算机这个数据在哪里,计算机就像外卖员一样根本不知道去哪里找这个数据。为了解决这个问题,就引入了指针这个概念,其实指针就是地址,目的就是让计算机直接找到数据在哪里,好比你告诉外卖员你家在某某小区602号房间,这样外卖员就可以很快的找到你,计算机同样可以高效对数据查找。

1.2内存

那么问题来了:
地址在计算机里面怎么产生的呢?

电脑有64位32位,这个32位代表的就是32跟地址线,地址线根电线差不多,只不过很细小,它可以产生正电或负点,或者是高低电位,亦或者是脉冲的有无。就这样的两种状态的转变,产生了我们熟知的二进制代码。32根地址线产生了32种 0 1 组合,根据高中的排列组合知识,总共有2^32组合,也就是有这些个地址。

我们将这一个个的二进制数称作一个比特位(学生),每个每个内存单元(宿舍)有8个比特位。把八个比特位叫做一个字节。这样2^32个内存单元就是2^32字节。这就是内存。

介绍一下内存单位的转换

1TB=1024GB

1GB=1024MB

1MB=1024KB;

1KB=1024Byte;

1Byte=8Bit;

这样三十二位机器的内存大小就是4GB


内存单元的编号 == 地址 == 指针

2.指针变量和地址

2.1取地址操作符(&)

变量的创建其实是像操作系统申请一块空间(地址)

有了地址之后计算机怎么到的这个地址呢?:

&操作符可以将一个变量、数组甚至是函数的地址取出来。看上图。

虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可 ⾏的。

2.2指针变量和解引⽤操作符(*)

2.2.1指针变量

C语言对不同的数据封装了不同的数据类型,同样指针也有对应的类型,便于创建指针变量。

我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如: 0x006FFD70 ,这个数值有时候也是需
要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。
指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会被理解成地址

2.2.2如何拆解指针类型

我们看到pa的类型是 int* ,那么如何理解呢?:
*表示这是一个指针变量,int表示这个指针指向的是一个int类型的变量
同样的如果是一个字符变量指针的类型是什么呢?

是的你答对了指针的类型就是char*,依次类推就可以知道其他指针的类型怎么写了。

2.2.3解引⽤操作符(*)

我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?
在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。
C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针) 指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。
有了解引用操作符我们可以 直接找对地址指向的对象并对他进行操作。当然可以直接对变量a进行修改,但是指针这种东西的作用极大,具体在后面介绍。

2.3指针变量的大小

以三十二位机器为例:32位机器意味着有32根地址线,可以产生2^32种不同的0 1组合,也就是32个比特位,换算成字节就是4字节, 因此32位机器中指针变量的大小就是4个字节,同样的在64机器中则是8字节。
总结:指针大小与指针类型无关只与平台大小有关。32位4字节,64位8字节

3.指针变量类型的意义

3.1指针的解引用

既然指针大小与指针类型无关,那么还要指针类型干什么呢?
先看两段代码:
调试我们可以看到,上面代码会将n的4个字节全部改为0,但是下面代码只是将n的第⼀个字节改为0。
结论:指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。

3.2指针+-整数

依旧先看一段代码

char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。

3.3void* 指针

void就是无的意思,表示 ⽆具体类型的指针(也叫 泛型指 针),它可以在函数中接收任何类型的指针。但是 void* 类型的指针不能直接进行指针的+-整数和解引用的运算。需要强制类型转换
具体void指针的作用,放在后面讲解解                                                                                                                                                                                                                                                

4.指针运算

指针运算共有三种:

指针加减整数;

指针加减指针;

指针的的关系运算;

4.1指针+-整数

不管是一维数组还是二维数组,他元素的地址都是连续排放,因此有了首元素的地址就可以顺藤摸瓜的找到其他元素。

4.2指针 +- 指针

指针减指针的结果的绝对值是两个指针之间元素的个数,这里有几个注意事项:

1.这个两个指针必须是连续的,否则你也不知道这两个位置的元素个数的意义是什么

2.这个两个指针的类型必须是相同的,因为类型决定的步长,不相同的两个指针类型,不法确定多长是一个元素

下面是指针-指针的用例 my_strlen的实现

4.3指针的关系运算

这边要注意:C语言规定指针只允许与数组最后一个元素后面的地址比较,不允许与第一个元素前面的元素比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值