1、指针定义
指针是一个变量, 它保存的是另一个变量的地址, 即内存位置的直接地址。
2、*p++、 *(p++)、 *++p、 ++*p、 *p+1、 *(p+1)
运行结果:
3.NULL指针和void*指针
NULL 是标准宏定义, 用来表示空指针常量, 在声明指针变量时若没有确切地址赋值, 可以给指针变量赋 NULL。
执行结果:
在大多数操作系统中程序不允许访问地址为 0 的内存, 因为该内存是操作系统保留的。 指针指向地址为 0 的内存表示该指针指向的地址不可访问。 按照惯例 NULL 指针假定为不指向任何东西。
void 表示”无类型”, void*指针表示”无类型指针”, 即可指向任何数据类型。
执行结果
注:void 几乎只能用于指针的声明和函数返回值以及函数形参, 不能用于变量的定义。
4、二维指针
二维指针:指向指针的指针。 保存一维指针的地址。
指针声明:int **ptr;
执行结果:
5、数组指针
指针定义:int (p)[n];指向数组整体的指针。 数组指针类型:int ()[n];
()优先级高, 所以 p 是一个指针, 指向一个整型的一维数组, 一维数组的成员个数位 n, 也就是说 p 的步长为 n。 即 p+1 偏移的地址为 n 个 int 型长度。 因此数组指针也称为行指针。
优先级: () > [] > *
示例一:数组指针指向一维数组示例。
执行结果:
示例二:数组指针指向二维数组示例:
6、指针数组
p[n];数组中保存 int指针。指针数组类型:int *[n], p的类型是 int **,p+1 偏移的地址为:sizeof(int *)。
- 示例一:将一维数组赋值给指针数组。
运行结果:
- 示例二:将二维数组赋值给指针数组示例
注:二维数组赋值给指针数组时 p=buff 是错误的。
7、函数指针
函数指针:指向函数的指针变量。 本质是指针变量。
执行结果:
注:定义函数指针时必须保证和所指向的函数形参返回值一致
8、回调函数
回调函数就是一个被作为参数传递的函数。
因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
回调函数在实际中有许多作用。假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,可以使用函数指针,并进行回调。
C语言的回调函数只能通过函数指针实现,在C++中则可以使用匿名函数(lambda)或仿函数(functor)作为回调函数。
- 回调函数示例:
执行结果: