本次课内容:指针与函数 教学目的:掌握作为函数参数的指针、数组指针、指向函数指针的 引用方法,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*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*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
四、main函数中的参数 main中可带参数,格式: main(int argc, char argylL) 说明: argc:存放字符串个数的整型变量。 argyI:存放各字符串首地址的指针数组。 argc和argv两名字可以自己定义,但类型是固定的。 例:设有C源程序myc,主函数包含有如上参数,进行编 译连接后生成的可执行文件为 myc. exe 执行 myc.exe时,打入以下命令执行该程序: myc 此时参数argc的值为1,argv0中存放的字符串为“my”的 地址。 若打入: myc ok good(代表 enter键) 此时参数argc的值为3,argv0中存放“myc”字符串的首地 址,ary1中存放“0串的首地址,arg2中存放“g0o外 串的首地址。例P220例6.30
四、main函数中的参数 main中可带参数,格式: main(int argc,char *argv[ ] ) 说明: argc: 存放字符串个数的整型变量。 *argv[ ] :存放各字符串首地址的指针数组。 argc和argv两名字可以自己定义,但类型是固定的。 例:设有C源程序myc.c,主函数包含有如上参数,进行编 译连接后生成的可执行文件为myc.exe。 执行myc.exe时,打入以下命令执行该程序: myc 此时参数argc的值为1,argv[0]中存放的字符串为“myc”的首 地址。 若打入: myc ok good (代表enter键) 此时参数argc的值为3,argv[0]中存放“myc”字符串的首地 址,argv[1]中存放“ok”串的首地址,argv[2]中存放“good” 串的首地址。例P220_例6.30
小结: 1、指针作为函数参数 2、函数返回指针 3、指向函数的指针 4、main函数中的参数
小结: 1、指针作为函数参数 2、函数返回指针 3、指向函数的指针 4、main函数中的参数
指针数据小结 、常用的指针类型变量归纳 int*p:p为指向整型数据的指针变量。 int(“Pptm P为指向含n个元素的一维数组 的指针变量。 Int(P); P为指向函授数的指针,该函数 带回一个整型值。 Int"PinE P为包含n个元素的指针数组, 每个元素指向一个整型数据。 nt*P()P为带回一个指针的函数,该指针指向 整型数据。 int**PP是一个指针变量,它指向一个指向整 型数据的指针变量,即指向指针的指针。 Int("P)inE P是一个指向另一个指针变量的 指针变量,被指向的指针变量指向一个含N个整型数据的 维数组
指针数据小结 一、常用 的指针类型变量归纳 int *p ; p为指向整型数据的指针变量。 Int (*P)[n] ; P为指向含n个元素的一维数组 的指针变量。 Int (*P)( ); P为指向函授数的指针,该函数 带回一个整型值。 Int *P[n]; P为包含n个元素的指针数组, 每个元素指向一个整型数据。 Int *P( ); P为带回一个指针的函数,该指针指向 整型数据。 Int **P; P是一个指针变量,它指向一个指向整 型数据的指针变量,即指向指针的指针。 Int (**P)[n]; P是一个指向另一个指针变量的 指针变量,被指向的指针变量 指向一个含N个整型数据的 一维数组
指针的运算 指针的运算: 指针与整数相加减 同一数组中各元素地址间的关系运算与相减运算 赋值运算 1、指针与整数相加、减 指针与整数相加减,表示指针在内存空间向下、 上移动,移动以其类型长度为单位。 如:int*P 指针加1,向下移动2个字节,减1,向上移动2 个字节。 2、指针同一数组中的元素的指针的关系运算与相减运 算 两个指向同一数组中的元素的指针相减,是计算 它们之间的元素数目。 3、指针赋值 指针通过赋值运算改变其所指向的实体
二、指针的运算 指针的运算: 指针与整数相加减 同一数组中各元素地址间的关系运算与相减运算 赋值运算 1、指针与整数相加、减 指针与整数相加减,表示指针在内存空间向下、 上移动,移动以其类型长度为单位。 如:int *P; 指针加1,向下移动2个字节,减1,向上移动2 个字节。 2、指针同一数组中的元素的指针的关系运算与相减运 算 两个指向同一数组中的元素的指针相减,是计算 它们之间的元素数目。 3、指针赋值 指针通过赋值运算改变其所指向的实体
(1)给指针赋以一个对应类型的变量地址 如:inta,*p p=ca (2)同类型指针间的赋值 如:inta2b,“p1,P2 p1=&ap2=8b p1=p2 (3)指针增1,减1,即指针向下或向上移动一个所指向 的数据类型空间。 增亻减1运算符与优先级相同,它们在同一表达 式中时,按结合性决定运算顺序。 如:inty*px3a=5px=&a (Px+1)=10 y=*++ px y=++ s px
(1)给指针赋以一个对应类型的变量地址 如: int a,*p; p=&a; (2)同类型指针间的赋值 如: int a,b,*p1,*p2; p1=&a,p2=&b; p1=p2; (3)指针增1,减1,即指针向下或向上移动一个所指向 的数据类型空间。 增1减1运算符与*优先级相同,它们在同一表达 式中时,按结合性决定运算顺序。 如:int y,*px,a=5; px=&a; *(px+1)=10; y = * + + px y = + + * px 10 6