发布时间:2023-01-14 18:00
前情提示:本篇博客的内容较多,阅读的时间可能会较长。而且图片也比较多,希望大家能够慢慢地、认真地看完,相信你一定会有收获的!!!
目录
一.指针初阶
1.内存
2.指针是什么
3.指针的大小
4.指针和指针类型
5.野指针
6.指针运算
7.指针和数组
8.二级指针
9.指针数组
二.指针进阶
1.字符指针
2.指针数组
3.数组指针
4.&数组名vs数组名
5.数组参数、指针参数
6.函数指针
7.函数指针数组
8.指向函数指针数组的指针
9.回调函数
10.自定义bubble_qsort函数
11.指针和数组笔试题解析
12.指针笔试题
内存是电脑中特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效地使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小是一个字节。为了能够有效地访问内存中的每个单元,就给内存单元进行了编号,这些编号就被称为该内存单元的地址。
其实指针就是地址。内存中的每个小的内存单元都有着自己的地址,为了方便找到我们想要的数据,我们可以定义一个指针变量来存放数据的地址。通过这个地址,我们就能很好地找到我们想要的数据。就好比,你的好朋友想来你宿舍找你,他只有知道你宿舍的门牌号(地址),才能更快地找到你。
变量是在内存中创建的(在内存中分配空间),因为每个内存单元都有地址,所以变量也是有地址的。那怎么取出变量的地址呢?请看下方的代码。
如果我们用指针存放一个变量的地址,那么我们对指针进行解引用操作就可以修改这个变量的值了。
在32位的机器上,地址是32个0 or 1组成的二进制序列,则地址就得用4个字节的空间来存储,所以一个指针变量的大小为4个字节。 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
学习这个内容之前,我们先看一下下面的这个代码。
我们可以看到,不管是什么类型指针,它们的大小都是4个字节。那跟类型有什么关系?类型好像没什么意义?我们是不是可以自己创建一直通用类型的指针呢?其实这样是行不通的,这也说明类型是有意义的。
对比上面的四张图片,我们可以发现:当pa是整型指针的时候,对它解引用后它可以访问四个字节并将四个字节的数据改为了00;而当pa是字符指针的时候,对它解引用后它只能访问一个字节并将这个字节的数据改为了00。只是指针类型发生了变化,指针访问的权限大小就发生了变化。那么说明指针类型是有意义的。对整型指针进行解引用操作能访问4个字节,而对字符指针进行解引用操作只能访问1个字节。通过这个例子,我们就可以知道指针类型决定了指针解引用的权限。 那指针类型还有别的意义吗?其实还有,我们通过下面的代码来学习一下。
我们可以看到p和pc打印出来的地址是一样的,但是p+1和pc+1所打印出来的地址是不一样的。p+1的地址比p的地址多加了4,而pc+1的地址比pc的地址只多加了1。这是为什么呢?因为p是整型指针,整形指针+1跳过1个整型,也就是跳过4个字节;而pc是字符指针,字符指针+1跳过一个字符,也就是跳过1个字节。这也就是为什么p+1的地址比p的地址多加了4,而pc+1的地址比pc的地址只多加了1。那么指针类型的第二意义就是:指针类型决定了,指针走一步,能走多远。 那我们再通过对比下面的两个例子来加深对指针类型意义的了解!
第一个程序中的p是整型指针,所以p+i表示跳过4*i个字节,指向数组第i+1个元素,然后通过解引用操作访问4个字节将数组中的元素改成0到9;而第二个程序中的p是字符指针,所以p+i表示跳过i个字节,而整型数据有四个字节,那么arr[0]就改成了0x03020100,对应的十进制数字为50462976.通过这两个代码的对比,我们就更能了解指针类型的意义。
概念:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
野指针成因