指针概念 :
- 指针就是个用来存放地址的变量,地址唯一标识一块内存空间
- 指针的大小是固定的4/8个字节(32位/64位)。
- 指针是有类型的,指针的类型决定了指针的+ -整数的步长,指针解引用操作的权限。整型指针解引用访问4个字节,字符指针解引用访问1个字节
字符指针(char*)
char *p ="abcdef" //“abcdef”是一个常量字符串(不能被改变),p中存储的是a的地址(首字符的地址)
指针数组 (是数组,用来存放指针的)
int main()
{
int arr[10]={0}; //整形数组
char ch[5]={0}; //字符数组
int *parr[4]; //存放整形指针的数组--指针数组
char *pch[5]; //存放字符指针的数组--指针数组
return 0;
}
arr----指首元素的地址
&arr----指数组的地址
数组指针 (是指针,用来存放数组地址的)
int *p=NULL; //p是整形指针--指向整形的指针,可以存放整形的地址
char *p=NULL; //p是字符指针--指向字符的指针,可以存放字符的地址
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int (*p)[10]=&arr; //p是数组指针--指向数组的指针,可以存放数组的地址
区分 :
int *p1[10]; //存放指针的数组
int (*p2)[10]; //存放数组的指针
p1先和[10]结合,一定是个数组;
p2先和 * 结合,一定是个指针;
int arr[5]; //arr是一个5个元素的整形数组
int *parr1[10]; //parr1是一个10个元素的数组, 每个元素的类型是int*,parr1是指针数组
int (*parr2)[10]; //parr2是一个指针,该指针指向了一个有10个元素的数组,每个元素的类型是int,parr2是数组指针
int (*parr3[10])[5]; //parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素的类型是int
数组参数、指针参数
一维数组传参
二维数组传参
二维数组传参,函数形参设计时,只能省略第一个[]的数字。
一级指针传参
一级指针传参,接收时也要用一级指针来接收
当函数的参数部分为一级指针的时候,函数能接收变量的地址,或存放地址的一级指针变量
二级指针传参
二级指针传参,接收时也要用二级指针来接收
当函数的参数部分为二级指针的时候,函数能接收一级指针变量的地址,二级指针变量,和存放一级指针的数组的数组名
函数指针 (是指向函数的指针)
&函数名 和 函数名 都是函数的地址
int (*pa)(int x,int y) = Add;
//代码1
(*(void)())0)();
//把0强制类型转换成 :void(*)() 函数指针类型--0就是一个函数地址
//调用0地址处的该函数
总结 :是一次函数调用 参数为无参,返回类型为void
//代码2
void (*signal(int ,void(*)(int)))(int);
//signal是一个函数声明,sianal函数参数有两个,一个是int,另一个是函数指针,该函数指针指向的函数的参数是int,返回类型是void。
//signal函数的返回类型也是一个函数指针,该函数指针指向的函数的参数是int,返回类型是void。
函数指针数组(存放函数指针的数组)
把函数的地址存放到一个数组中,那这个数组就叫函数指针数组
int(*parr[4])(int,int)={Add,Sub,Mul,Div}; //函数指针数组
函数指针类型 |
parr先和[4]结合,说明是数组,数组的内容是 int (*)() 类型的函数指针
指向函数指针数组的指针 (是指针,该指针指向一个数组,数组的元素都是函数指针)
回调函数
回调函数是一个通过函数指针调用的函数,如果把函数的地址作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于对该事件或条件进行响应。