一、指针数组 & 数组指针
普通数组:
char a[5] = {"a","b","c","d","e"};
等价于
char (*p)[5] = {"a","b","c","d","e"};
a[0] == a的值 == (*p)[0];
a[1] == b的值 == (*p)[1];
...
即数组名a与(*p)等价,都代表数组的首地址,此为数组指针
指针数组:
char *a[5] = {"a","b","c","d","e"};
a[0] == a字符所在的地址值
a[1] == b字符所在的地址值
...
代表数组的5个元素都为char *指针类型,数组元素的值为指针类型,占4或8个字节,此为指针数组
二、函数指针
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址
函数指针是指向函数的指针变量,指针变量的值即为函数入口地址
有了指向函数的指针变量后,可用该指针变量调用函数
函数指针有两个用途:调用函数 和 作为函数的参数
1.函数调用
-
常规方法:
int func(int x); //声明一个函数:形参为int 返回值类型为int int (*fun_ptr)(int); //声明一个函数指针,指针名为fun_ptr fun_ptr = func; //将func函数的首地址赋给指针 fun_ptr(3); //通过函数指针调用该函数
-
typedef方法:
int func(int x); //声明一个函数:形参为int 返回值类型为int typedef int (*PTRFUN)(int); //将参数为int 返回int值指针类型取别名为PTRFUN PTRFUN ptr_fun; //声明一个函数指针,指针名为ptr_fun ptr_fun = func; //同样将func函数的首地址赋给指针 ptr_fun(3); //通过函数指针调用该函数
2.作为函数参数,效果类似 多态
void MyFun1(int x) //函数1
{
printf(“函数MyFun1中输出:%d\n”,x);
}
void MyFun2(int x) //函数2
{
printf(“函数MyFun2中输出:%d\n”,x);
}
void MyFun3(int x) //函数3
{
printf(“函数MyFun3中输出:%d\n”,x);
}
typedef void (*FunType)(int); //定义一个函数指针类型FunType,与②函数类型一致
//关键!!以函数指针作为参数传入
void CallMyFun(FunType fp,int x)
{
fp(x); //通过fp的指针执行传递进来的函数
}
//不使用typedef版
void CallMyFun(void (*fp)(int),int x)
{
fp(x); //通过fp的指针执行传递进来的函数
}
int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10);
CallMyFun(MyFun2,20); //通过CallMyFun函数分别调用三个不同的函数,实现多态
CallMyFun(MyFun3,30);
}
网友评论