函数指针:
顾名思义这是一个指针,不过指向的是一个函数。
定义:存储类型 返回值类型 (*指针变量名)(形参列表)
初始化:
int (*p)(int x,int y)=func;//func为函数名,x和y为func函数的形参名
int (*p)(int x,int y)=&func;//含义上一行相同,不过一般不这么写
int (*p)(int ,int )=func;//func为函数名
上述代码解释:p是一个指针,它指向了一个返回值为int 型,有两个int型形参的函数。
赋值:
int (*p)(int x,int y)=func1;//func1为函数名,x和y为func函数的形参名
p=func2;//func2也是一个函数名
用途:通过函数指针来间接调用它所指向的函数,在回调函数中经常用到。
指针数组:
顾名思义这是一个数组,不过数组中存放的元素为指针。
定义:存储类型 数据类型 *数组名[数组元素个数]
eg:int *array[10];//定义了一个有10个int *类型的数组。[]的优先级比*优先级高
指针数组在char型中有很多用法。
eg:
char *str[3]={"Hi","Good","Moon"};
这是什么意思呢,str数组中有三个char *类型的元素。它们分别指向"Hi", "Good", "Moon"这三个字符串。即str[0]是一个指针指向"Hi" 这个字符串的首元素地址。
注意:关注它们的偏移量:str+1 和*str+1这两个偏移量是不同的,str+1指向了str这个数组的首元素的下个元素,即偏移到了str[1]这个元素。而*str+1则是先对str取内容,str这里代表数组首元素的地址(&str[0]),*str便是str[0],str[0]+1指向的是这个指针指向字符串的首元素的之后一个元素。
数组指针:
这是一个指针,它指向的是一个数组。
定义:存储类型 数据类型 (*数组名)[数组元素个数],因为[]的优先级比*高,所以要用()来使*的优先级变高
数组指针很多时候和二维数组搭上关系
eg:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=a;
先来看p,p是一个指针,指向了一个有4个int类型数据的数组。a是一个二维数组,可以看作a内有三个其内有4个int型元素的数组。便于理解可以认为a[3][4]={a[0],a[1],a[2]};这里仅是便于理解,实际是不能这么写的。这个时候就可以知道int (*p)[4]=a; 的意思了。p指向了a的首元素地址(&a[0]);
来看偏移量:因为p指向的是a的首元素地址,所以p+1指向了a的第二个元素地址(&a[1])。
再看*p+1:*p便得到了a[0],而a[0]是a[0]这个数组的数组名,数组名在这里表示数组首元素地址。所以*p==&a[0][0];那么*p+1便指向了a[0][1]; 这就是偏移量的不同。那么**p是多少呢? **p==1(a[0][0]);
注意:由上可以知道p 和 *p的地址相同的,都是a[0][0]的地址,但是它们含义不同,偏移量是不同的。
函数指针数组
释义:这是一个数组,不过数组中的元素是函数指针
定义:返回值类型 (*数组名[N])(形参列表)
eg:
int (*p[5])(int ,int );
/*p是一个有5个元素的数组,
元素是指向返回值为int型,有两个int型形参的指针*/
可以通过函数指针数组来间接调用函数。上述的调用方式为: p[0](整型数,整型数 )或者*(p[0])(整型数 ,整型数 )。这两种方式都可以。
注意:因为这是一个数组,所以存放在其内的函数指针都是相同类型的,即指针指向的函数都是相同类型的。(相同类型的返回值,相同的形参个数和形参数据类型)。