本次课内容:指针与函数 教学目的:掌握作为函数参数的指针、数组指针、指向函数指针的 引用方法,man函数参数的使用方法。重点:函数实参、形参为 指针时的应用。 难点:实参和形参为指针时的对应关系。 预习:一维数组元素的引用方法: (1)下标法:a【 (2)地址法:*(a+l (3)用指针变量:int*paE5]=1,3,5,7,9 a print(“%d”°p 二维数组指针表示方法:如:int*pa[3]3] 在此定义中若0≤=<3,0<<3,则a正】]的地址可 用以下五种表达式求得 引用 (1)&a[iJ afi]tj1 (2)ai]+ (a[i]+) (3)“(aH) ((a+)+]) (4)&aD]+3* &aco0]+3+) (5)ao]+3i+ ((a+i)[j
本次课内容:指针与函数 教学目的:掌握作为函数参数的指针、数组指针、指向函数指针的 引用方法,main函数参数的使用方法。重点:函数实参、形参为 指针时的应用。 难点:实参和形参为指针时的对应关系。 预习:一维数组元素的引用方法: (1)下标法: a[ i ] (2)地址法:*(a+i) (3)用指针变量: int *p,a[5]={1,3,5,7,9}; p=a; printf(“%d”,*p); 二维数组指针表示方法:如: int *p,a[3][3]; 在此定义中若 0<=i<3,0<=j<3,则a[ i ][ j ]的地址可 用以下五种表达式求得: 引用 (1) &a[ i ][ j ] a[ i ][ j ] (2) a[ i ]+j *(a[ i ]+j ) (3) *(a+i )+j *(*(a+i)+j) (4) &a[0][0]+3*i+j *(&a[0][0]+3*i+j ) (5) a[0]+3*i+j ( *(a+i))[ j ]
、指针作为函数的参数 1、实参为地址,形参为指针变量 an x[10 1012 20 014 void sub(int*px int*py); Int x,y; SU b(&x,&y); printf(%d,%dⅦn”,x,y); void suvlint px, int *py) 1012 2px=10; py=20: 1014 结果:10,20
一、指针作为函数的参数 1、实参为地址,形参为指针变量 main() { void sub (int *px ,int *py); int x,y; sub(&x,&y); printf(“%d,%d\n”,x,y); } void suv(int *px,int *py) { *px=10; *py=20; } 结果:10,20 px py 1012 1014 x y 10 20 1012 1014
2、实参为数组名,指针变量,形参为指针变量 #define N 10 /*1p203 6.19*/ maint (0 &a void max_min( int artT, int*ptl, int*pt2) int array8,10,2,5,0,7,154,5},中p1,p2,a,b; pl=&p2=&b; max mn arrayal,p2, n printf("max_od, mIn=%od a, b); &b void max_mf(int arrD int*ptl, int*pt /ion t int i ptl=*pt2=arr[0; array pt a t2&b or(-1;i<m;F十) arr fif (arri>*pt1)*ptl=arri; if (arri<*pt2)*pt2=arri array
2、实参为数组名,指针变量,形参为指针变量 #define N 10 /*例p203_6.19*/ main() { void max_min( int arr[ ] , int *pt1 , int *pt2 ); int array[N]={1,8,10,2,-5,0,7,15,4,-5},*p1,*p2,a,b; p1=&a;p2=&b; max_min(array,p1,p2,N); printf(“max_=%d,min=%d”,a,b); } void max_min( int arr[ ],int *pt1,int *pt2,int n) { int i; *pt1=*pt2=arr[0]; for (i=1;i<n;i++) { if (arr[i]>*pt1) *pt1=arr[ i ]; if (arr[i]<*pt2) *pt2=arr[ i ]; } } &a p1 a &b p2 b &a pt2 &b pt1 array arr array 1 8 10 2
3、实参为指向数组的指针变量、形参为数组 main f int arr add(int arrl l ,int n); static int al34={1,3,5,7,9,1,13,15,17,19,21,23}; int*p, total 地址 arr p=a[0 pa00元素 arro totafarr add(p, 12 a[0J a[O][1]3 arrl printf((tota%”otal; a0j[2 arr jol3 arr3 arr add(intark 1 int n a arr 4 i int i, sum=0 for(i=0; i<n; i ++)p &a[] a[! 12 are arr sum+=arri; return(sum); a2][0 arr[ 8 arr &a[OJO arr 9 2 arr 运行结果: a[2][3] 23 arr[11] total=144
3、实参为指向数组的指针变量、形参为数组 main() { int arr_add(int arr[ ],int n); static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p,total; p=a[0]; total=arr_add(p,12); printf(“total=%d\n”,total); } arr_add(int arr[ ],int n) { int i,sum=0; for ( i=0;i<n;i++) sum+=arr[i]; return(sum); } 运行结果: total=144 arr[0] arr[8] arr[9] arr[10] arr[11] arr[3] arr[4] arr[5] arr[6] arr[7] arr[1] arr[2] a[0][0] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0][1] a[0][2] a[0][3] 1 3 5 7 9 11 13 15 17 19 21 23 元素 地址 arr, p, &a[0][0] p &a[0][0] a[0] arr &a[0][0]
、指向函数的指针 1、指向函数的指针变量的定义格式 类型标识符(*指针变量)() 如:int(*p)() 2、指针变量指向函数 设有函数fun1,p为指向函数的指针变量 则p=funl;/p指向函数入口地址* 3、指向函数指针调用函数 格式: (*指针变量)(实参数) 如:(*p)(a,b) 例P212例625 、返回指针值的函数 函数的返回值是指针 函数的定义格式:类型符*函数名(形参,…) s: int *fun (int a, int b) 返回值为指向一个整型数据的指针。 例P217例628
二、指向函数的指针 1、指向函数的指针变量的定义格式 类型标识符 (*指针变量)(); 如:int (*p)( ); 2、指针变量指向函数 设有函数fun1,p为指向函数的指针变量 则 p=fun1; /*p指向函数入口地址*/ 3、指向函数指针调用函数 格式: (*指针变量)(实参数) 如:( *p )(a,b); 例P212_例6.25 三、返回指针值的函数 函数的返回值是指针。 函数的定义格式:类型符 *函数名(形参,…) 如:int *fun(int a,int b) 返回值为指向一个整型数据的指针。 例P217_例6.28