一、函数指针 “类型名 (*指针变量名)(函数参数表列)”
1. 使用指向函数的指针,通过指针变量访问它所指向的函数:求整数a和b中的大者。
源代码:
#include <stdio.h>
int max(int x,int y) //注意返回值的类型为整型
{
return (x>y)?x:y;
}
int main()
{
int a,b,c;
int (*p)(int,int); //指向函数的指针变量p
p=max; //使函数指针p指向max函数
while(scanf("%d %d",&a,&b)!=EOF)
{
c=(*p)(a,b); //通过指针变量(间接)调用max函数
printf("%d %d max=%d\n",a,b,c);
}
return 0;
}
程序截图:
2. 输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数;选2时调用min函数,输出二者中的小数。
源代码:
#include <stdio.h>
int max(int x,int y)
{
return (x>y)?x:y;
}
int min(int x,int y)
{
return (x<y)?x:y;
}
int main()
{
int n,a,b;
int (*p)(int,int);
int result;
while(scanf("%d %d",&a,&b)!=EOF)
{
scanf("%d",&n);
if(n==1)
p=max;
else if(n==2)
p=min;
result=(*p)(a,b);
printf("%d\n",result);
}
return 0;
}
程序截图:
3. 用指向函数的指针做函数参数:有两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中的大者;输入2,就给出a和b中的小者;输入3,则求a与b的和。
源代码:
#include <stdio.h>
int max(int a,int b)
{
return (a>b)?a:b;
}
int min(int a,int b)
{
return (a<b)?a:b;
}
int sum(int a,int b)
{
return (a+b);
}
int fun(int x,int y,int (*p)(int,int)) //该函数形参是函数指针,接收作为实参的不同功能函数名的入口地址
{ //使其指向相应的功能函数
int result;
result=(*p)(x,y);
printf("%d\n",result);
}
int main()
{
int a,b,c;
int (*p)(int,int);
int n;
while(scanf("%d %d",&a,&b)!=EOF)
{
scanf("%d",&n);
if(n==1)
fun(a,b,max);
else if(n==2)
fun(a,b,min);
else if(n==3)
fun(a,b,sum);
}
return 0;
}
程序截图:
二、指针数组 “类型名 *数组名[ 数组长度 ]”
注意指针数组与指向一维数组的指针变量的区别:例如int *p[4]; int (*p)[4];
(不等长)字符串排序,其中5个字符串已给定
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 81
void sort(char *name[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++) //选择法排序(实际上是改变指针数组各元素指向)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(name[k],name[j])>0)
k=j;
}
if(k!=i)
{
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
}
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
int main()
{
int n=5;
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; //确定指针数组各元素指向的5个字符串
sort(name,n);
print(name,n);
return 0;
}
程序截图:
三、多重指针(指向指针的指针)
1. 接上例,使用指向指针(数据)的指针变量,输出排序前的上述5个字符串
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 81
int main()
{
int i;
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; //确定指针数组各元素指向的5个字符串
char **p;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s\n",*p);
}
return 0;
}
程序截图:
2. 用指向指针的指针的方法,输出n及n个整型数组的元素,然后输出
源代码:
#include <stdio.h>
#define maxn 1010
int main()
{
int i,n,**p; //**p是指向指针型数据的指针变量
int a[maxn],*num[maxn]; //指针数组num保存整型数组a元素的地址
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
num[i]=&a[i]; //获得a数组元素地址
p=&num[i]; //首先p指向指针数组的第一个元素num[0]
printf("%d ",**p); //p=&num[i],*p=num[i]=&a[i],**p=a[i],因此用**p输出整型数组a中的元素
}
printf("\n");
}
return 0;
}
程序截图:
四、动态内存分配
建立动态数组,输入n及n个学生的成绩,另外用一个函数检查其中有无低于60分的,若有,则输出不及格的成绩。
源代码:
#include <stdio.h>
#include <stdlib.h>
void check(int *p,int n)
{
int i;
for(i=0;i<n;i++)
{
if(*(p+i)<60)
printf("%d\n",*(p+i));
}
}
int main()
{
int i,n;
int *p;
while(scanf("%d",&n)!=EOF)
{
p=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",p+i); //"p=&a[i]"
check(p,n);
}
return 0;
}
程序截图: