指针学习记录(2)
8.5指向函数的指针
定义一个指向函数的指针变量,用来存放某一函数的起始地址。例如
int (*p)(int,int);
定义p是一个指向整型函数的指针变量,且有两个整型参数是函数。p的类型用int(*)(int,int)表示。
8.5.2用函数指针变量调用函数
调用函数指针的示例:
#include<stdio.h> int main() { int max(int, int); //函数声明 int(*p)(int, int); //定义函数指针变量P int a=2, b=3, c; p = max; c = (*p)(a, b); //调用函数指针 printf("max is %d", c); return 0; } int max(int x, int y) { int z; if (x > y) z = x; else z = y; return z; }
注意:(1)(*p)两边的括号不能少,表示p先于 * 结合,是指针变量 如果写成下面这种形式
int *p(int,int); //这表示声明一个p(int ,int)函数了,这个函数的返回值为指向整型变量的指针;
(2)在程序中定义的函数指针只能指向定义时候,指定的类型的函数。一个指针变量可以指向同类型的不同函数;
(3)如果要用指针调用函数,必须先使指针变量指向该函数 如:p=max;
8.5.3用指向函数的指针做函数参数
指向函数的指针可以作为函数的参数,把函数的入口地址传递给形参。
举个简单例子,如下:
#include<stdio.h> int main() { int fun(int x, int y,int(*p)(int,int)); //fun函数声明 int max(int, int); int min(int, int); int a = 34, b = -21, n; printf("请输入1或2,1代表最大,2代表最小\r\n"); scanf("%d", &n); if (n == 1) fun(a, b, max); //max作为实参传入 else if (n == 2) fun(a, b, min); return 0; } int fun(int x, int y, int(*p)(int, int)) { int result; result = (*p)(x, y); printf("%d\n", result); } int max(int x, int y) { int z; if (x > y) z = x; else z = y; return z; } int min(int x, int y) { int z; if (x < y) z = x; else z = y; return z; }
当n=1时候,将max 函数入口地址传递给fun函数中的形参p。
当n=2时候,将min 函数入口地址传递给fun函数中的形参p。
8.6返回指针值的函数
一个函数可以返回整型,字符型,也可以返回指针型的数据,即地址。例如int *a(int x,int y); 其中,a是函数名,调用以后得到int*型的指针。
例:有a个学生,每个学生有b 门课程的成绩。要求用户在输入学生序号后,能输出该学生的全部成绩;用指针函数实现;s
#include<stdio.h> int main() { float score[][4] = { {60,70,80,90},{55,43,92,43,},{20,98,100,30} };//定义二维数组代表3个学生,4门成绩 float* search(float(*pointer)[4], int n); //定义返回指针值的函数,第一个形参是数组指针,第二参数是学号 float* p; int i, k; printf("请输入学生学号(1-3)"); scanf("%d", &k); printf("该学生的学号是:%d\n", k); p = search(score, k); for (i = 0; i < 4; i++) { printf("%5.2f\t", *(p + i)); printf("\n"); } return 0; } float* search(float(*pointer)[4], int n) { float* pt; pt = *(pointer + n); return (pt); }
想要看明白这段代码,务必了解指针指向二维数组这一章节。*(pointer+n) 是指向第n行第0个元素的地址。即&score[k][0]; 至于后面输出的的*(p+i),实际就是 *(*(pointer+n)+i) ,代表第n行第i列的值 score[n][i]。
8.7指针数组
如果一个数组里面的元素全部为指针变量,则称为指针数组;
如 :int *p[4] 。[ ]优先级比*高,所以先结合成p[4],这是一个数组,然后再与*结合,表示这个数组是指针类型。
指针数组适合用来指向若干字符串,使字符串的处理更加灵活。
请看例子:将若干字符串按字母顺序由小到大输出:
#include<stdio.h> #include<string.h> int main() { void sort(char* name[], int n); void print(char* name[], int n); //函数声明 char *name[ ] = { "Follow me","Base","Hello world","Fly ","English" }; //定义指针数组,它的5个元素,分别指向5个字符串 int n = 5; sort(name, 5); print(name, 5); return 0; } 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[k]; name[k] = name[j]; name[j] = temp; } } } void print(char* name[], int n) { int i; for (i = 0; i < n; i++) { printf("%s\n", name[i]); } }
strcmp() 函数用于字符串比较,如果name[k]所指的字符串大于name[j]则此函数为正值。
8.7.3指针数组作为 main函数的形参
有些时候,main函数可以有形参 如
int main(int argc,char*argv[]);
第一个参数argc,意思是命令行中参数个数,第二个参数argv 是一个指针数组,数组中的每个元素指向命令行中的一个字符串


浙公网安备 33010602011771号