------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----
第一讲 指针函数
一、指针函数的概念
所谓函数类型是指函数返回值的类型,在c语言中允许一个函数的返回值是一个指针(地址),这种返回指针的函数称为指针型函数。
二、指针函数的定义
定义指针型函数的一般形式为:
int *sum(int a,int b){
}
类型说明符 *函数名(形参表){
/*函数体*/
}
注意:返回值是一个指针。
1 /* 2 指针函数: 3 4 返回值是指针的函数 5 6 指针函数的定义: 7 8 指针类型 *函数名(){ 9 10 return 地址; 11 } 12 13 */ 14 #include <stdio.h> 15 16 //返回的是两个数中大数的地址 17 //返回的是形参x和y的大数的地址 18 int *max(int x, int y){ 19 20 printf("x = %p\n",&x); 21 printf("y = %p\n",&y); 22 return x>y?&x:&y; 23 } 24 25 int *max2(int *x, int *y){ 26 27 printf("max x = %p\n",x); 28 printf("max y = %p\n",y); 29 return *x>*y ?x :y; 30 31 } 32 int main (int argc , const char * argv[]) { 33 34 //返回a 、b两个数中大数的地址 35 int a=3,b=4; 36 printf("a = %p\n",&a); 37 printf("b = %p\n",&b); 38 int *p = max2(&a,&b); 39 printf("p = %p\n",p); 40 41 return 0; 42 } 43 //证明了 调用函数的时候形参变量是新分配的空间 44 // 实参和形参只是值传递
应用题:
1 /* 2 思考&实现1: 3 4 通过指针函数,输入一个1~7之间的整数,输出对应的星期名。 5 6 */ 7 #include<stdio.h> 8 9 char *getDay(int n){ 10 11 //定义一个字符串指针数组 12 char *days[] = { 13 14 "星期一", 15 "星期二", 16 "星期三", 17 "星期四", 18 "星期五", 19 "星期六", 20 "星期日" 21 22 }; 23 24 return n>=1&&n<=7?days[n-1]:"输出错误!"; 25 26 } 27 int main (int argc,const char *argv[]){ 28 29 printf("%s\n",getDay(3)); 30 return 0; 31 } 32 33 34 /* 35 思考&实现2: 36 37 用指针变量作为函数的参数,求出10个数的最大值。 38 */ 39 40 #include<stdio.h> 41 42 int getMax(int *p,int len){ 43 int max = *p; 44 for(int i = 1;i<len;i++){ 45 if(*(p+i)>max){ 46 47 max = *(p+i); 48 49 } 50 } 51 return max; 52 } 53 int main(int argc,const char *argv[]){ 54 55 int a[10]={123,35,65,485,554,12,354,471,74,111}; 56 int m = getMax(a,10); 57 printf("m = %d\n",m); 58 59 return 0; 60 }
函数指针
一、函数指针
在c语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存的首地址。
我们可以把函数的这个首地址赋予一个指针变量,是该指针变量指向该函数。
然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。(存放函数的首地址的指针变量)
二、函数指针定义方法
函数指针变量定义的一般形式为:
类型说明符(*指针变量名)(函数的参数);
类型说明符表示返回值类型
"(*指针变量名)"表示“*”后面的变量是定义的指针变量。
最后的空括号是表示指针变量所指的是一个函数。
三、函数指针的初始化
函数的声明:
int sum(int a,int b); ----> 函数指针 int (*p1)(int a,int b);
//定义了一个函数指针 p1
//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
//函数指针的初始化
p1 = sum; //sum存的就是函数在内存中的首地址。
int sum(int a,int b){
return a+b;
}
int main(int argc,const char *argv[]){
int x= 3,y =4;
int s = sum(x,y);
//定义函数指针
int (*p)(int a,int b);
//初始化函数指针
p = sum; //sum函数的首地址
// p = f1; 不可以的
//注意:定义函数指针的时候,可以不用写形参名
int (*p1)(int ,int );
p1 = sum;
return 0;
}
1 /* 2 函数指针的方法 3 简易计算器 4 */ 5 #include <stdio.h> 6 7 // 简易计算器 8 9 int sum(int x,int y){ 10 11 return x+y; 12 13 } 14 int jian(int x,int y){ 15 16 return x-y; 17 18 } 19 int cheng(int x,int y){ 20 21 return x*y; 22 23 } 24 int chu(int x,int y){ 25 26 return x/y; 27 28 } 29 30 int main (int argc , const char * argv[]) { 31 32 //定义一个函数指针 33 int (*p)(int ,int ); 34 35 switch(2){ 36 case 1: 37 p = sum; 38 break; 39 case 2: 40 p = jian; 41 break; 42 case 3: 43 p = cheng; 44 break; 45 case 4: 46 p = chu; 47 break; 48 49 } 50 //(*p)(23,45) 51 int s = p(23,45); 52 printf("%d\n",s); 53 54 return 0; 55 }