指向函数的指针
(1)函数指针
用来存放某一函数的起始地址,例如:int(*p)(int, int);
(2)用函数指针变量调用函数
一个简单的例子:求a和b中的大者。
#include <stdio.h>
int main()
{
int max(int, int);
int(*p)(int, int);
int a, b, c;
p = max;
printf("Please enter a and b:\n");
scanf_s("%d,%d", &a, &b);
c = (*p)(a, b);
printf("a=%d\nb=%d\nmax=%d\n", a, b, c);
return 0;
}
int max(int x, int y)
{
int z;
if (x > y)
z = x;
else
z = y;
return z;
}
(3)用指向函数的指针作函数参数
#include <stdio.h>
int main()
{
int max(int, int);
int min(int, int);
int add(int, int);
void fun(int x, int y, int(*p)(int, int));
int a = 34, b = -21, n;
printf("please choose 1,2 or 3:");
scanf_s("%d", &n);
if (n == 1) fun(a, b, max);
else if (n == 2) fun(a, b, min);
else if (n == 3) fun(a, b, add);
return 0;
}
void fun(int x, int y, int(*p)(int, int))
{
int resout;
resout = (*p)(x, y);
printf("%d\n", resout);
}
int max(int x, int y)
{
int z;
if (x>y)z = x;
else z = y;
printf("max=");
return(z);
}
int min(int x, int y)
{
int z;
if (x<y)z = x;
else z = y;
printf("min=");
return(z);
}
int add(int x, int y)
{
int z;
z = x + y;
printf("sum=");
return(z);
}
返回指针值的函数
定义:类型名 * 函数名(参数列表);
例子1:a个学生,b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。使用返回指针值的函数来实现。
#include <stdio.h>
int main()
{
float score[][4] = { { 60, 70, 80, 90 }, { 56, 89, 67, 88 }, { 34, 78, 90, 66 } }; //定义数组,存放成绩
float *search(float(*pointer)[4], int n); // 函数声明
float *p;
int i, k;
printf("enter the number of student:");
scanf_s("%d", &k); // 输入要找的学生的序号
printf("The scores of No.%d are:\n", k);
p = search(score, k); //调用search函数,返回score[k][0]的地址
for (i = 0; i<4; i++)
printf("%5.2f\t", *(p + i)); // 输出score[k][0]到score[k][3]的值
printf("\n");
return 0;
}
float *search(float(*pointer)[4], int n) // 定义函数,形参pointer是指向一维数组的指针变量
{
float *pt;
pt = *(pointer + n); // pt的值是&score[k][0]
return(pt);
}
例子2:找出其中有不及格的课程的学生及其学生号。
#include <stdio.h>
int main()
{
float score[][4] = { { 60, 70, 80, 90 }, { 56, 89, 67, 88 }, { 34, 78, 90, 66 } }; //定义数组,存放成绩
float *search(float(*pointer)[4]); // 函数声明
float *p;
int i, j;
for (i = 0; i<3; i++)
{
p = search(score + i); //调用search函数,如有不及格返回score[i][0]的地址,否则返回NULL,
if (p == *(score + i)) //如果返回的是score[i][0]的地址
{
printf("No.%d score:", i);
for (j = 0; j<4; j++)
printf("%5.2f ", *(p + j)); // 输出score[i][0]到score[i][3]的值
printf("\n");
}
}
return 0;
}
float *search(float(*pointer)[4]) // 定义函数,形参pointer是指向一维数组的指针变量
{
int i = 0;
float *pt;
pt = NULL; // 先使pt的值为NULL
for (; i<4; i++)
if (*(*pointer + i)<60) pt = *pointer; // 如果有不及格课程,使pt指向score[i][0]
return(pt);
}
总结:上面的这些例子中,都涉及二维(多维)数组,明确指针的指向。
牢记数组名 —— 一维数组名 —— 二维数组名,即a —— a[ ] —— a[ ][ ] (一级一级的变更)
指针数组
其元素均为指针类型数据,即指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
eg:
int *p[4];
char *name[] = { "Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design" };
指向指针数据的指针
定义:char **p;
eg1:
#include <stdio.h>
int main()
{char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
char **p;
int i;
for(i=0;i<5;i++)
{p=name+i; //"Follow me"这一元素的地址(首地址) 的地址给了p,p此时指向它
printf("%s\n",*p); //*p表示"Follow me"的地址,*p亦表示为字符指针,故可输出……
}
}
eg2:
#include <stdio.h>
int main()
{int a[5]={1,3,5,7,9};
int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
int **p,i;
p=num;
for(i=0;i<5;i++)
{printf("%d ",**p);
p++;
}
printf("\n");
return 0;
}
通过上面两个eg搞明白指针数组、指向指针数据的指针的各种关系。