CottLi
3/12/2020 - 8:46 AM

指针与函数

函数与指针

基本概念

  • 函数的首地址:函数的入口地址,函数的首地址就是函数名,可见函数名本身就是地址;
  • 指向函数的指针变量:存放函数入口地址(函数指针)的变量,称为指向函数的指针变量;

函数指针的定义、赋值和调用

  • 定义:类型 (*函数指针变量名)(形参表);,如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);       // 将数组地址返回
}