我们直接做一个练习,定义一个函数,用来交换两个变量的内容。
void swap(int *x, int *y);
void main(){
int x = 20, y = 10;
swap(&x, &y);
printf("x = %d, y = %d", x ,y);
}
void swap(int *x, int *y){
int t;
t = *x;
*x = *y;
*y = t;
}
代码非常简单,我也就不细讲了。这里传入的参数为指针,所以调用 swap 方法后 x,y 的内容发生了交换。如果直接传入 x,y,那么交换只在 swap 中有效,在 main 中并没有交换。
4.2、函数的返回值为指针
返回值为指针的函数声明如下:
数据类型 *函数名(参数列表){
函数体
}
//例如:
int s;
int *sum(int x, int y){
s = x + y;
return &s;
}
在函数调用前要声明需要对函数声明(有点编译器不需要)
int s;
void mian(){
int *r = sum(10, 9);
printf("10 + 9 + %d", *r);
}
int *sum(int x, int y){
s = x + y;
return &s;
}
除了上面的操作,更实用的是返回一个指向数组的指针,这样就实现了返回值为数组。
指向函数的指针
C 语言中,函数不能嵌套定义,也不能将函数作为参数传递。但是函数有个特性,即函数名为该函数的入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。
函数指针定义如下:
数据类型 (*函数指针名)();
1
函数指针在进行“*”操作时,可以理解为执行该函数。函数指针不同与数据指针,不能进行+整数操作。
下面举个例子,来使用函数指针:
#include <string.h>
/**
* 定义一个方法,传入两个字符串和一个函数指针 p,用 p 对两个字符串进行操作
*/
void check(char *x, char *y, int (*p)());
void main(){
//string.h 库中的函数,使用之前需要声明该函数。字符串比较函数
int strcmp();
char x[] = "Zack";
char y[] = "Rudy";
//定义一个函数指针
int (*p)() = strcmp;
check(x, y, p);
}
void check(char *x, char *y, int (*p)()){
if(!(*p)(x, y)){
printf("相等");
}else{
printf("不相等");
}
}
利用函数指针调用方法具体操作如下:
(*p)(x, y);
1
指针除了这些地方,还在结构体中用处巨大。
|