函数与指针
基本概念
- 函数的首地址:函数的入口地址,函数的首地址就是函数名,可见函数名本身就是地址;
- 指向函数的指针变量:存放函数入口地址(函数指针)的变量,称为指向函数的指针变量;
函数指针的定义、赋值和调用
- 定义:
类型 (*函数指针变量名)(形参表);
,如float (*pf)(int a[])
;
- 赋值:使得函数指针指向某个函数,如
pf = &max
,此处max
为函数名;
- 使用函数指针调用函数:
(*函数指针变量名)(实参表)
,如(*pf)(a)
;
#include<stdio.h>
int max(int *p)
{
int i,t = *p; // 取值运算符获取指针变量指向的值;
// 遍历数组中的每个元素
for(i=1; i<10; i++)
// 如果某个元素比当前的最大值 t 还要大,则将该元素的值赋给 t
if(*(p+i)>t) t=*(p+i);
return t; // 返回最大值 t
}
int main()
{
int i,m,a[10];
int (*pf)(int a[]); // 定义函数指针,注意参数和返回值和函数定义保持一致
for(i=0;i<10;i++) // 通过循环读入10个数据
scanf("%d",&a[i]);
pf=&max; // 将函数的地址赋给函数指针
m=(*pf)(a); // 使用函数指针调用函数
printf("max=%d\n",m); // 打印函数的返回值
return 0;
}
返回指针的函数
- 一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址;
- 返回指针值的函数一般定义为:
类型名 *函数名(参数列表)
,注意这里强调的是函数,其返回值是地址;
/*调用返回指针的函数输出指定学生的成绩*/
#include<stdio.h>
int main()
{
float score[][4]={{ 60,70,80,90},{56,89,67,88},{34,78,90,66}}; // 定义 3 x 4 的数组存放学生成绩
float *search(float (*pointer)[4],int ), *p; // 声明返回指针的函数,其参数为“数组指针”
int i,m;
printf(" enter the number of student:");
scanf("%d",&m); // 读入希望查询成绩的学生为第几个
printf(" The scores of No,%dare:\n",m);
p=search(score,m); // 调用函数将二维数组中第 m+1 个学生(序号从0开始)的成绩所在的行地址返回
for(i=0;i<4;i++) // 遍历并输出行指针指向的那一行成绩
printf("%5.2f\t",*(p+i));
return 0;
}
float * search(float (*pointer)[4],int n) // 二维数组名为数组指针,注意其指针类型
{
float *pt; // 声明浮点型指针,该指针指向浮点型变量
pt=*(pointer+n); // 行指针 pointer 加 n,表示从二维数组首行往下挪 n 行
// *(pointer+n) 获取数组指针指向的数组,也就是第n+1行
// 一维数组
return(pt); // 将数组地址返回
}