指针与函数
在函数以外的区域内,一般无法修改函数的实参值,但是通过指针变可以间接的改变。
如:
#include <stdio.h>
void swap(int *x,int *y);
void swap(int *x,int *y)
{
int temp;
printf("In swap,交换前:x = %d,y = %d",*x, *y);
temp = *x;
*x = *y;
*y = temp;
printf("In swap,交换后:x = %d,y = %d",*x, *y);
}
int main(void)
{
int x = 3, y = 4;
printf("In main,交换前:x = %d,y = %d",*x, *y);
swap(&x,&y);
printf("In main,交换前:x = %d,y = %d",*x, *y);
return 0;
}
In main,交换前:x = 3,y = 4
In swap,交换前:x = 3,y = 4
In swap,交换后:x = 4,y = 3
In main,交换后:x = 4,y = 3
#指针函数
类比之前的指针数组和数组指针,可知指针函数是函数返回值为指针。
需要注意的是不能把局部变量的指针(即函数内部的指针)作为函数的返回值。
列如:
#include <stdio.h>
char *getword(char c);
char *getword(char c)
{
switch(c)
{
char str[]={app};//在这里变是把局部变量作为函数的返回值。
case a: return str;
default :return end;
}
}
int main(void)
{
char a;
printf("请输入一个字母:");
scanf("%c",&a);
printf("%s\n",getword(a));
}
#函数指针
函数指针就是一个指向函数的指针。
##函数指针作为参数
#include <stdio.h>
int add(int, int);
int sub(int, int);
int calc(int(*pa)(int, int), int, int);
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int calc(int(*pa)(int, int), int x, int y))//一个参数是函数,两个参数是整数。
{
return (*pa)(x, y);
}
int main(void)
{
int x, y;
printf("请输入2个数:");
scanf("%d %d",&x,&y);
printf("%d + %d = %d\n",x, y, calc(add)(x, y));
printf("%d - %d = %d\n",x, y, calc(sub)(x, y));
return 0;
}
##函数指针作为返回值
函数指针作为返回值又该怎么声明呢?
指针函数的样子是 int*a();
我们知道这个式子的 int*
是返回的类型 a是名字()则是参数。
那么同理函数指针作为返回值就是要先声明一个函数a()//a为名字()为参数
,然后再写上函数指针,把它作为返回类型即可。
所以函数指针作为返回值的声明便是这样int(*a())(int, int);
使用这个式子便可通过一个函数调用另外一个函数。(上面的函数指针作为参数则是在一个函数里调用另外一个函数的返回值)。
举个列子,修改上一个代码来做个简陋计算器。
#include <stdio.h>
double add(double, double);
double sub(double, double);
double mul(double, double);
double divi(double, double);
double calc(double(*fp)(double, double), double , double );
double (*select(char op))(double, double);
double add(double x, double y)
{
return x + y;
}
double sub(double x, double y)
{
return x - y;
}
double mul(double x, double y)
{
return x * y;
}
double divi(double x, double y)
{
return x / y;
}
double calc(double(*fp)(double, double), double x, double y)
{
return (*fp)(x, y);
}
double (*select(char op))(double x, double y)
{
switch(op)
{
case '+': return add;
case '-': return sub;
case '*': return mul;
case '/': return divi;
}
}
int main(void)
{
double x, y;
char op;
printf("请输入一个式子如(3+4):");
scanf("%lf%c%lf",&x,&op, &y);
printf("%lf %c %lf = %lf \n",x, op, y, calc(select(op), x, y));
return 0;
}
这样一个简陋的计算器就完成了。