C语言之指针与函数
C语言之指针与函数
前言
指针的重要应用场景是作为函数的参数以及函数的返回值。那么我们就需要有一下三个问题:
1、如何使用指针作为函数参数;
2、如何定义和使用返回值为指针的函数;
3、如何定义和使用指向函数的指针变量
一、如何使用指针作为函数参数
1、变量的指针作为函数参数
这种操作方式的结果是主调函数中对应的局部变量的作用域被拓展被调函数中。被调函数就可以通过这些局部变量向主调函数传递数据。也就是说利用指针作为函数参数可以实现在被调用的函数中修改主调函数中变量的内容。
2、数组的指针作为函数参数
一维数组的指针作为函数参数
代码示例
#include<stdio.h>
//将一维数组中的元素按相反顺序排列
void invert(int *x,int n)//指针变量指向数组,数组长度为n
{
int t,*p,*i,*j,m=(n-1)/2;//m为中间元素的下标
i=x;//指向数组的首元素
j=x+(n-1);//指向数组最后一个元素
p=x+m;//指向数组的中间元素
for(;i<=p;i++,j--)
{
t=*i;
*i=*j;
*j=t;
}
}
void main()
{
int a[6]={1,4,5,6,8,3},i;
printf("数据排列前:\n");
for(i=0;i<6;i++)
printf("%d ",a[i]);
invert(a,6);
printf("\n数据相反排列后\n");
for(i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
}
二维数组的指针作为函数参数
二维数组(int a[3][4])的指针作为函数参数时,函数形参有列指针变量(int *p1=a[0])和行指针变量(int (*p2)[4])两种形式,对应的实参也是列指针和行指针。
代码示例
//已知二个学生各四门课程的成绩,分别利用二维数组的列指针和行指针,计算总平均值
void average(float *p,int n)//形参是列指针
{
float *p_end=p+(n-1),sum=0,aver;
for(;p<=p_end;p++)
sum+=*p;
aver=sum/n;
printf("总平均分为%.2f\n",aver);
}
void average(float (*p)[4],int row,int col)////形参是行指针
{
float sum=0,aver;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
sum+=*(*(p+i)+j);
}
}
aver=sum/(row*col);
printf("总平均分为%.2f\n",aver);
}
void main()
{
float score[2][4]={{60,70,80,90},{66,68,89,71}};
average(*score,2*4);
average(score,2,4);
}
二、如何定义和使用返回值为指针的函数(简称指针函数)
定义格式:函数类型 *函数名([形参表])
补充:
在C语言的库中包含了3个用于内存动态分配的函数malloc()、calloc()、realloc(),它们的返回值均为空类型的指针(void *),可以通过强制转换的方法将其转换为任何其它类型的指针。释放内存可以通过函数free()来实现。
三、如何定义和使用指向函数的指针变量
C程序中的一个函数在编译时会被分配一个入口地址,称该入口地址为函数的指针。类似于数组,函数名也代表了函数的指针。
定义示例:int (*p) (int,int);//定义指向返回值为整型的函数的指针变量
代码示例
//比较两个数的大小
int max(int x,int y)
{
return (x>y?x:y);
}
void main()
{
int (*p) (int,int);
int a=6,b=8,c;
p=max;
c=(*p)(a,b);
printf("%d和%d最大值为%d\n",a,b,c);
}