一.函数原型
1.1 函数原型是什么?
函数头以;
结尾,构成函数原型。
1.2 函数原型怎么用?
函数原型通常放在头文件里面或者调用它的函数的前面。
1.3 函数原型有什么用?
提前告诉编译器使用的函数基本信息(名称、参数个数类型、返回类型)。
1.4 函数前置声明
- 试一试
#include <stdio.h>
void func();// 函数前置声明
void main(){
func();
}
void func(){
printf("Hello World\n");
}
通常把main()
放在代码最前面便于阅读,但是这样会导致编译时因为找不到main()
内部调用函数而错误或警告。在main()
前加上函数原型可以解决这类问题,称为函数前置声明。
二.指针与函数
1.函数名
函数名与数组名一样表示的是地址,不同的是函数名是执行函数代码的起始位置,数组是数组第一个元素的地址。
直接使用函数名
func
和取函数地址&func
获取的值是相同的。
2.函数指针
函数指针是指向函数的指针变量,即本质是一个指针变量。
void (*pfunc)();//函数指针定义(优先级解引用)
pfunc = &func;// pfunc = func; 赋值
(*pfunc)();// pfunc(); 函数指针调用
例:实现数组元素的和积差商的函数。
#include<stdio.h>
//打印函数:
void print_array(int arr[],int n){
int* p = arr;
while(p<arr+n){
printf("%d ",*p++);
}
printf("\n");
}
//加法函数:
int add_array(int arr[],int n){
int* p = arr;
int res = *p;
while(++p<arr+n){
res = res + *p++;
}
return res;
}
//减法函数:
int subtract_array(int arr[],int n){
int* p = arr;
int res = *p;
while(++p<arr+n){
res = res - *p++;
}
return res;
}
//乘法函数:
int multipy_array(int arr[],int n){
int* p = arr;
int res = *p;
while(++p<arr+n){
res = res * *p++;
}
return res;
}
//除法函数:
int divide_array(int arr[],int n){
int* p = arr;
int res = *p;
while(++p<arr+n){
res = res / *p++;
}
return res;
}
int add(int a,int b){
return a+b;
}
int subtract(int a,int b){
return a-b;
}
int multipy(int a,int b){
return a*b;
}
int divide(int a,int b){
return a/b;
}
//函数作参数 回调函数
int operation(int arr[],int n,int (*pfunc)(int,int)){//返回值是int型
//两个参数是int型
int* p = arr;
int res = *p;
while(++p<arr+n){
res = (*pfunc)(res,*p);
}
return res;
}
int main(){
//终端输入:
int n;
scanf("%d",&n);
int arr[n];
int* p = arr;
while(p<arr+n){
scanf("%d",p++);
}
print_array(arr,n);
/* printf("%d\n",add_array(arr,n));
printf("%d\n",subtract_array(arr,n));
printf("%d\n",multipy_array(arr,n));
printf("%d\n",divide_array(arr,n)); */
//定义一个函数指针数组:
int (*pfunc[4])(int arr[],int n) = {add_array,subtract_array,multipy_array,divide_array};
for(int i =0;i<4;++i){
printf("%d\n",pfunc[i](arr,n));
}
/* printf("%d\n",operation(arr,n,add));
printf("%d\n",operation(arr,n,subtract));
printf("%d\n",operation(arr,n,multipy));
printf("%d\n",operation(arr,n,divide)); */
int (*opt[])(int,int) = {add,subtract,multipy,divide};
for(int i =0;i<4;++i){
printf("%d\n",operation(arr,n,opt[i]));
}
}
3.指针函数
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。