1、void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp;main() int a, b; a = 15; b = 8; Swap( &a, &b ); printf( a=%d,b=%d ,a,b);void Swap(int x,int y) int temp; temp = x; x = y; y = temp;main() int a, b; a = 15; b = 8; Swap(a, b); printf( a=%d,b=%d ,a,b);程序程序 1程序程序 2 主调函数主调函数被调被调函数函数实实 参参形形
2、 参参主调函数主调函数被调函数被调函数1515ab实实 参参形形 参参88xyabxy主调函数主调函数被调函数被调函数&a&a实实 参参形形 参参&b&b*x*yabxy15 ab844.1 4.1 指针作为函数的参数指针作为函数的参数a(地址地址2000)p2000main() f(int main() f(int * *b);b); int a , int a ,* *p=&a; p=&a; a=3; a=3; * *b=7;b=7; f(p); return; f(p); return; printf( printf(“%d%d”,a); ,a); b2000n 形参形参b b所指的内存
3、单元即为所指的内存单元即为a a变量的内存变量的内存n 对对b b所指的对象的改变,在函数返回后,实所指的对象的改变,在函数返回后,实参参p p所指的对象的也改变了,同样改变了所指的对象的也改变了,同样改变了a a的的值。注意与值。注意与传值调用传值调用的区别的区别37 7为什么使用指针做函数参数?为什么使用指针做函数参数?用指针作函数参数,可以返回多个值用指针作函数参数,可以返回多个值 减少参数传递过程中的数据复制量。减少参数传递过程中的数据复制量。用指针作函数参数,通过将数据区用指针作函数参数,通过将数据区的地址传递给函数,使函数能够改的地址传递给函数,使函数能够改动该地址处的数据。动该地
4、址处的数据。swap(int *p1, int *p2)swap(pa,pb);swap(int x,int y)swap(a,b);8void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参与形参均用数组例例 将数
5、组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723m=4例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The ar
6、ray has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参用数组,形参用指针变量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma数组60711594723ijijijjiji例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,
7、*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d ,*p);实参与形参均用指针变量实参与形参均用指针变量例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i
8、=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d ,*p);实参用指针变量实参用指针变量,形参用形参用数组数组n函数可以返回一个指针,该指针指向一个已定义的任一类型函数可以返回一个指针,该指针指向一个已定义的任一类型的数据,定义格式为:的数据,定义格式为: 数据类型数据类型 *函数名函数名(参数表参数表)return 返回的返回的应为应为与函数类型相同的指针值与函数类型相同的指针值调用函数时接受的调用函数时接受的变量也应为变量
9、也应为相同类型的指针值相同类型的指针值不要使用数组名不要使用数组名接收指针型函数的返回值接收指针型函数的返回值n一个函数的入口地址称为函数的指针,当一个指针一个函数的入口地址称为函数的指针,当一个指针变量的值为一个函数的入口地址时,称其为变量的值为一个函数的入口地址时,称其为指向函指向函数的指针变量数的指针变量。n定义函数指针的一般格式为:定义函数指针的一般格式为: (*指针变量名指针变量名) ( ); n通过将函数名赋给函数指针的方法,可以使函数指通过将函数名赋给函数指针的方法,可以使函数指针指向某个函数。针指向某个函数。( (* * )()(实参表实参表) ); ( (实参表实参表) );
10、pmain()main() int f1(int,int); int f1(int,int); int f2(int,int,int); int f2(int,int,int); int ( int (* *p)( );p)( ); int c,d; int c,d;p p=f1; c=p(5,10); p=f2; d=p(8,9,10);函数函数 f1 ,f2指令代码指令代码指令指令1指令指令2f1指令指令1指令指令2f2相当于执行:相当于执行:c=f1(5,10)相当于执行:相当于执行:c=f2(8,9,10)定义了一个指针变量定义了一个指针变量p,p可以指向一类函数,可以指向一类函数,这
11、类函数返回值也是整型值。换句话说,这类函数返回值也是整型值。换句话说,所有返回值为整型的函数,都可以用这个指针代替。所有返回值为整型的函数,都可以用这个指针代替。 定义定义含义含义int i;int *p;int an;int *pn;int (*p)n;int f();int *p();int (*p)();int *p;定义定义整型变量整型变量ip为指向整型数据的为指向整型数据的指针变量指针变量定义含定义含n个元素的个元素的整型数组整型数组an个指向整型数据的指针变量组成的个指向整型数据的指针变量组成的指针数组指针数组pp为指向含为指向含n个元素的个元素的一维整型数组的指针变量一维整型数组的指针变量f为返回整型数的函数为返回整型数的函数p为返回指针的函数,该为返回指针的函数,该指针指向一个整型数据指针指向一个整型数据p为指向函数的指针变量,该为指向函数的指针变量,该函数返回整型数函数返回整型数p为指针变量,它为指针变量,它指向指向一个一个指向整型数据的指针变量指向整型数据的指针变量指针的数据类型指针的数据类型21