文章目录
- 前言
- 内存略述
- 一、啥是指针?
- 内存
- 二、指针和指针类型(指针类型的重要性)
- 2-1指针加减整数
- 2-2 野指针
- 避免野指针
- 两个地址相减
- 指针和数组
- 多级指针
- 指针数组
前言
大家好啊!又是我这个快乐跑路人,扫雷的展开没有多少东西我就把之前的扫雷更新了一下把展开放到哪里了,今天我们来弄一下指针(指针作为c语言中最重要的一部分自然不能一下子弄完,所以我分为初始指针和详解指针。)
——————————————————————————————————————————————————————
(快乐分割线(^ ▽ ^))
内存略述
讲指针之前还是要先略讲一下内存.
首先为了方便查找我们把内存分为一个个的内存单元.
内存地址又被编上一个个号(一般以十六进制呈现).
内存编号就被称为地址一个地址占一个字节.
内存单元的编号由地址线(物理的电线)的通电产生.
一、啥是指针?
1.指针是内存单元中最小的编号,也就是地址。
2.平时口语说的指针一般是指针变量是用来存放地址的变量。
我们通过一个十分简单的代码来观察一下内存的原理:
内存
int main(void)
{
int a = 0;
int* p = &a;
return 0;
}
最上面的地址是a的地址我们可以通过&a来得到作为int 类型的a变量他的地址却知识所占四个内存单元的开头的一个所以我们就称每个变量开头的内存单元为地址
p得到的也只是开头的内存单位
p作为指针在32位计算机的大小为4字节
在64位计算机中8个字节的大小
因为
32位机器上每个地址是32个0或1也就是32个比特位一个字节是8个比特位所以我们要储存32个比特位就需要4个字节大小
同理
64位机器就需要8个字节大小的指针来存放地址。
二、指针和指针类型(指针类型的重要性)
2-1指针加减整数
此例子只是为了证明不同类型的指针有着不同的意义。
在32位机器下所有的指针都有这相同的4个字节大小(64位机器则有8个字节大小)
但是他们所控制的字节大小不同
如图:
我们用char类型的指针来控制int类型的变量就没有按照我们心里所想的那样来执行本应该打印2的最后却打印了怪怪的数字而我们用相同类型的指针来控制就没发生上述怪事。我们来用内存来解释此事。
上图:
开始时我们将a设成了44332211
经历了char类型指针的操作我们发现我内存里的a内容就只有一个字节的内容发生了改变可是我们int变量有四个字节的空间啊,所以就发生产生了那个奇奇怪怪?的数字。而我们使用int类型的指针进行操作又会发生什么呢?
上图!!!
诶!这一下我们四个字节的内容都发生了改变,这样我们的int a就可以被安排明白了
而在不同类型指针加整数的时候地址的变化也是不同的
所以指针类型相对应十分的重要。
从上面的例子可以看出指针类型对应的必要性。
小结: 指针类型决定了在解引用的时候能一次访问几个字节的能力
2-2 野指针
1.不对指针进行初始化
如图
2.越界访问
如图
当p指针越界到数组之外是p就为野指针
3.
当指针访问的内存被销毁
如图
我们的p指针接收并保存了函数返回的a的地址但是在我们后续使用p时a的地址已经被摧毁了所以在后续使用时我们p指针的内容不在收到保护就会发生变化
从而我们的p就变成了野指针。
避免野指针
如果我们明确知道这个指针为野指针我们可以通过对其赋值为NULL(意为空指针),当我们知道他为空指针时我们就可以用if语句来避免野指针的使用
如
这样我们在使用指针的时候就可以不用提心吊胆的想有没有野指针了(只要程序中的野指针被赋值为NULL)。或者不想用之前用的指针的时候也可以将其赋值为NULL。
两个地址相减
前提条件:两个指针指向同一块空间。即两个元素之间的内存是连续的。
两个地址相减的绝对值是他们之间的元素个数
如图
他们地址相减的绝对值就是地址之间元素的个数。地址位于元素头部
——————————————————————————————————————————————————————
无关内容 (并不重要)
*(在标准中我们在使用指针时可以向后适当进行赋值和比较但不允许向前这样)
原话:
此内容并不重要
——————————————————————————————————————————————————————
指针和数组
因为数组内存存放的连续性所以指针和数组总是会有许多挂钩
下图我们可以看出 &arr[i] 和p+i和&p[i]等价都指向同一块内存
p[i] 和arr[i]也是等价的在被编译的时候都会先被编译成*(p+i)的形势所以两者也是等价的。
多级指针
(因本人也是菜鸡一枚所以多级指针咱只讲建立多级指针和多级指针是啥如何使用此篇文章没有讲述)
——————————————————————————————————————————————————————
先上图
(我们都以整型指针为例子进行讲述)
一级指针我们用int* pa 来创建二级则用int** ppa 来创建其他则类似。
当然一级指针存放的是变量地址二级指针则存放的是一级指针的内存地址
如果我们想解引用二级指针来找到我们变量的内容我们只需使用两次解引用操作符
如图
我们依旧通过二级指针对a进行了改变。
当然多级指针肯定有更大的用途我会在不就的将来更新出来。
指针数组
类似于整型数组之类的指针数组依旧是数组的一种形式
指针数组就是用来储存指针的数组。
当然我们可以看到指针数组并没有被完全定义后面的指针就为空指针及NULL指针不能被访问。