C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)

指针的重要概念:
指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
指针的大小是固定的4/8个字节(32位平台/64位平台)。
指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
指针的运算。

1. 字符指针

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第1张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第2张图片

代码 char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放到字符指针 pstr 里
了,但是/本质是把字符串 hello bit. 首字符的地址放到了pstr中。 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第3张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第4张图片

2. 指针数组 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第5张图片

 来看几个指针数组的应用:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第6张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第7张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第8张图片

 3. 数组指针

数组指针是指针

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第9张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第10张图片

 数组名是首元素地址有两个例外:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第11张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第12张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第13张图片

 如果传参传过去的是地址:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第14张图片

数组指针的使用: 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第15张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第16张图片   //数组名arr,表示首元素的地址
  //但是二维数组的首元素是二维数组的第一行
  //所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
  //可以数组指针来接收

再来看看下面代码的意思:

4. 数组参数、指针参数

4.1 一维数组传参

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第17张图片

4.2 二维数组传参 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第18张图片

4.3 一级指针传参 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第19张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第20张图片

4.4 二级指针传参 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第21张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第22张图片

5. 函数指针 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第23张图片

 输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第24张图片

通过函数指针调用函数的实例:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第25张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第26张图片

阅读两段有趣的代码: 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第27张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第28张图片

6. 函数指针数组 ‘

先来看一段代码:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第29张图片

如何进行简化呢?使其变为函数指针数组的形式

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第30张图片

 使用实例:

设计一个计数器:

1.一般方法:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第31张图片

2.通过函数指针数组改良的简便方法:

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第32张图片

 7. 指向函数指针数组的指针

指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第33张图片

8. 回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一
个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该
函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或
条件进行响应。

首先演示一下qsort函数的使用:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第34张图片

首先来看看void* base的作用

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第35张图片

size_t num表示的是待排序的元素个数 

size_t width表示一个元素的大小,单位是字节

注:size_t表示的是无符号整型

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第36张图片

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第37张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第38张图片

 接下来我们用qsort函数来自己写一个冒泡排序:C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第39张图片

 注:Swap函数里面注意width不能忽略,还要注意每一个字节比较完毕过后都要向后跳一个字节

同时还要注意这个函数使用了回调函数的思想

9. 指针和数组笔试题解析

题目:

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第40张图片

运行结果:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第41张图片

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第42张图片

题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第43张图片

运行结果:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第44张图片

解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第45张图片

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第46张图片

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第47张图片

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第48张图片

运行结果:

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第49张图片 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第50张图片

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第51张图片

题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第52张图片

运行结果:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第53张图片

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第54张图片

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第55张图片

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第56张图片

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第57张图片

运行结果:

答案解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第58张图片

总结:
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。

4.strlen渴望得到的是一个地址,从传参过去的地址开始向后数,直到\0位置,\0之前有多少个字符就有多长 

5.二维数组的数组名表示首元素地址,但这里的首元素地址指的是第一行的地址;a[0]在二维数组中代表的是第一行的数组名

例子:

int a[3][4];

二维数组的数组名为a;   a-二维数组的首元素地址(第一行)的地址

第一行的数组名是a[0];     a[0]代表第一行第一个元素的地址

第二行的数组名是a[1];     a[1]代表第二行第一个元素的地址

第三行的数组名是a[2];     a[2]代表第三行第一个元素的地址

sizeof(a)         &a

sizeof(a[0])    &a[0]

sizeof(a[1])    &a[1]

sizeof(a[2])    &a[2]    以上四种情况的数组名都表示整个数组

10. 指针笔试题

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第59张图片

解析结果:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第60张图片 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第61张图片

解析结果:这里一定要注意+1到底是什么在+1,注意强制类型转换过后类型的转变

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第62张图片

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第63张图片

解析结果:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第64张图片

运行结果:

 

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第65张图片

 解析结果:

a[0]是第一行的数组名,单独的a[0]表示首元素的地址

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第66张图片 

题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第67张图片 

结果解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第68张图片 

题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第69张图片 

 结果解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第70张图片

题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第71张图片 

结果解析:

这里的char**应当如何理解呢?

char* *pa;

前面一个char*表示++会跳过一个char*类型,*pa表示pa是一个指针

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第72张图片 

 题目:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第73张图片

结果解析:

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第74张图片 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第75张图片

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第76张图片 

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第77张图片  

C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第78张图片 

 C语言进阶指针详解完整版(数组指针,指针数组的辨析,函数指针)_第79张图片

运行结果:

 

 

 

你可能感兴趣的:(C语言,c语言)