函数指针&指针函数(附指针&数组)
“()” 优先级高于 “*”
“[]” 优先级高于 “*”
函数指针
1、指向函数的指针变量。
注:C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。
3、定义格式: 类型 (* 指针变量名) ( 形参列表 );
注:“形参列表”表示指针变量 指向的函数 所带的参数列表。
4、赋值:(例)
int func(int x); //声明一个函数
int (*f) (int x); //声明一个函数指针
注:赋值时函数func不带括号,也不带参数。func代表函数的首地址,经赋值后,指针f就指向函数func()的入口。
#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
int (*ptr)(int, int);
int a, b, c;
ptr = max;
scanf("%d%d", &a, &b);
c = (*ptr)(a,b);
printf("a=%d, b=%d, max=%d", a, b, c);
return 0;
}
5、定义函数指针类型:typedef int (*Fun_ptr) (int,int);
声明函数指针变量,并赋值: Fun_ptr maxFunc=max;
#include<stdio.h>
void function1()
{
printf("function1\n");
}
void function2()
{
printf("function2\n");
}
void main()
{
typedef void(*Fun_ptr)(); //Fun_ptr 为指向函数的指针类型
Fun_ptr pfun=function1;
pfun();
pfun=function2; //赋给函数指针pfun的函数function2 应该和 函数指针所指函数
pfun(); //的原型相一致:void function();
}
指针函数
1、返回值类型是指针的函数。
2、定义格式:类型* 函数名 ( 形参列表 );
#include <stdio.h>
float* find(float(*pionter)[4],int n); //函数声明
int main(void)
{
static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};
float *p;
int i,m;
printf("Enter the number to be found:");
scanf("%d",&m);
printf("the score of NO.%d are:\n",m);
p=find(score,m-1);
for(i=0;i<4;i++)
printf("%5.2f\t",*(p+i));
return 0;
}
float* find(float(*pionter)[4],int n) //定义指针函数,pointer是一个指向数组的指针
{
float *pt;
pt=*(pionter+n); //从数组 {60,70,80,90} 移动n次到数组 {34,23,56,45}
return(pt);
}
注:pointer是指向包含3个一维数组的指针变量。
pointer+n指向score的第n+1行,*(pointer+1)指向第一行的第0个元素。
补充:指针&数组
指针数组:*a[i] 或 *(a[i]) //数组a中的元素都为int型指针
数组指针:(*a)[i] //指向数组a的指针
常用:指针数组
用指针数组来代替多维数组,一个常见的用法就是处理字符串。
eg.
#include <cstdio>
char *Names[]=
{
"Clare",
"Paul",
"Charles",
"0"
};
int main(int argc, char** argv)
{
char **n=Names;
while(*n!="0")
printf("%s\n",*n++);
return 0;
}
注:数组中的最后一个元素被初始化为 "0",while循环以次来判断是否到达数组末尾。
综上
问:void (*(*papf)[2])(int);
这个papf是什么东西?(摘自C++ Primer)
答:
(*papf)[2] //papf是一个指针,它指向一个数组,这个数组有两个元素
*(*papf)[2] //papf是一个指针,它指向一个数组,这个数组有两个元素,且都是指针
*(*papf)[2]() //papf是一个指针,它指向一个数组,这个数组有两个元素,且都是函数指针,
*(*papf)[2](int) //并且此函数拥有一个int参数,
void *(*papf)[2](int); //无返回值