重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
/*
为富蕴等地区用户提供了全套网页设计制作服务,及富蕴网站建设行业解决方案。主营业务为网站建设、网站制作、富蕴网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针,要和函数的返回类型一样
2,指针的*和名字,要用小括号括起来//不括起来就是指针函数了,意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致,只要类型,不要形参名即可,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定义函数指针、形参名字a、b可有可无,但有的话看上去更清晰,只要函数定义的类型、参数类型、以及参数个数,与这个指针一致,那么这个指针p,就可以指向它
p = swapchar;//p指针接管swapchar函数,只要给函数名字,就可以给过去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//这里把swapchar2函数的地址,给了p,这时p从swapchar地址,转移到了swapchar2这里。
p(chf,chg);
return 0;
}
C语言中函数指针与普通指针没什么差别,只是指向的内容不同而已。主要作用:
1、实现面向对象编程中的多态性。
2、回调函数。
函数指针是指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。
函数指针有两个用途:调用函数和做函数的参数。
1、使用场景
使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:
#includestdio.h
#include stdlib.h
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a数组首地址
//*b=2; 无法直接初始化
//printf("%d\n", *b);
e=e+2; //移动两个地址单元
d=c; //d指向c的地址来表示值
c=4; //修改原c变量的值,d指针的值会发生改变
b=(int *)malloc(sizeof(int));//为b分配一个int型空间来直接存储值
*b=2;//分配空间后可以直接赋值了
printf("this is e,b,c,d :%d %d %d %d\n",*e,*b,c,*d);
2、类型说明
(1)int *a :表示一个指向int型变量的指针,指向的是变量的地址单元
(2)char *b:表示一个指向char变量的指针
*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p\n",*a,*(a+1),a);
扩展资料:
指针的运算
指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算
(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d\n",*a);
结果输出2。
参考资料来源 :指针-百度百科