指针的重要概念:
指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
指针的大小是固定的4/8个字节(32位平台/64位平台)。
指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。
指针的运算。
1. 字符指针
代码 char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放到字符指针 pstr 里
了,但是/本质是把字符串 hello bit. 首字符的地址放到了pstr中。
2. 指针数组
来看几个指针数组的应用:
3. 数组指针
数组指针是指针
数组名是首元素地址有两个例外:
如果传参传过去的是地址:
数组指针的使用:
//数组名arr,表示首元素的地址
//但是二维数组的首元素是二维数组的第一行
//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
//可以数组指针来接收
再来看看下面代码的意思:
4. 数组参数、指针参数
4.1 一维数组传参
4.2 二维数组传参
4.3 一级指针传参
4.4 二级指针传参
5. 函数指针
输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
通过函数指针调用函数的实例:
阅读两段有趣的代码:
6. 函数指针数组 ‘
先来看一段代码:
如何进行简化呢?使其变为函数指针数组的形式
使用实例:
设计一个计数器:
1.一般方法:
2.通过函数指针数组改良的简便方法:
7. 指向函数指针数组的指针
指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针
8. 回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一
个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该
函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或
条件进行响应。
首先演示一下qsort函数的使用:
首先来看看void* base的作用
size_t num表示的是待排序的元素个数
size_t width表示一个元素的大小,单位是字节
注:size_t表示的是无符号整型
接下来我们用qsort函数来自己写一个冒泡排序:
注:Swap函数里面注意width不能忽略,还要注意每一个字节比较完毕过后都要向后跳一个字节
同时还要注意这个函数使用了回调函数的思想
9. 指针和数组笔试题解析
题目:
运行结果:
答案解析:
题目:
运行结果:
解析:
题目:
答案解析:
题目:
运行结果:
答案解析:
题目:
答案解析:
题目:
运行结果:
答案解析:
题目:
答案解析:
题目:
运行结果:
答案解析:
总结:
数组名的意义:
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. 指针笔试题
解析结果:
题目:
解析结果:这里一定要注意+1到底是什么在+1,注意强制类型转换过后类型的转变
题目:
解析结果:
运行结果:
题目:
解析结果:
a[0]是第一行的数组名,单独的a[0]表示首元素的地址
题目:
结果解析:
题目:
结果解析:
题目:
结果解析:
这里的char**应当如何理解呢?
char* *pa;
前面一个char*表示++会跳过一个char*类型,*pa表示pa是一个指针
题目:
结果解析:
运行结果: