指针函数和函数指针
指针函数:
概念理解:
指针函数是指函数返回的类型是某类型的指针的函数。【大白话:“指针”是定语,修饰主语“函数”,所以指针函数就是一个函数,只不过返回的数据类型有点特殊,是个地址值】
声明格式:
类型说明符 *函数名(参数)
int *f(int x,int y){
......
}
//这里就是定义了一个返回值类型为指向整型变量的指针的函数,所以函数f就是一个指针函数
指针函数的调用:
int *p;
p=f(3,7);
//函数的返回值必须用同类型的指针变量来接收
函数指针:
概念理解:
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”,也就是函数指针了。【大白话:“函数”是定语,修饰“指针”,所以函数指针就是一个指针,这个指针指向的是一个函数的入口地址】
声明格式:
类型说明符(*指针变量名)();
int (*fptr)(); //声明一个函数指针
函数指针的赋值:
fptr=&func
fptr=func
/*
上面两种写法都表示同一个意思,即将func函数的首地址赋值给指针fptr。这里也可以省略&,因为单单一个函数名就代表着函数的首地址
*/
函数指针的调用:
int x;
x=(*fptr)();
x=fptr();
/*
两种写法都对,如果函数指针所指的函数是需要传递参数的,需要在后面的括号里写上要传递的参数,
例如:x=fptr(参数1,参数2,......)
*/
函数指针的例子:
void A{
printf("A\n");
}
void B{
printf("B\n");
}
int main (){
void (*funcp)(); //定义一个函数指针
funcp=A; //把函数A的首地址赋值给函数指针funcp
(*funcp)(); //调用A这个函数,因为是void型,所以不需要参数来接收
funcp=B; //现在把函数B的首地址赋值给funcp
(*funcp)(); //调用函数B
}
//程序输出的结果是:A (换行) B
下面用一个例子来实践一下函数指针:
#include <stdio.h>
void printElement(int n) {
printf("%d ", n);
}
void TraverseLinkList(int p[5],void (*visit)(int m)) {
int n;
for (n = 0; n < 5; n++) {
visit(p[n]); //调用传递过来的函数
}
}
int main() {
int num[5] = { 2,4,6,8,10 }; //定义一个数组
void (*fpt)(int n); //定义一个函数指针变量
fpt = printElement; //让这个指针指向printElement函数的首地址
TraverseLinkList(num,fpt);
return 0;
}
//程序输出为:2 4 6 8 10
以上是个人在学习过程中的一些理解和记录,如有错误,欢迎指正批评~~~
参考信息来源:https://zhidao.baidu.com/question/95800995.html