
第10章 函数的进一步讨论
第10章 函数的进一步讨论

10.1指针变量作为函数形参一地址传递 特点:共享内存,“双向”传递 例交换两数并输出 方法一: (main) main() 2000 变量a int a,b; 2004 5 ←一变量b int swap(int,int); 9 2008 scanf("%d,%d",&a&b); COPYA 2012 (swap) ←一变量x swap(a,b)月 2016 9 一变量y printf("\n%d,%d n",a,b); 2020 5 ←变量temp 5 swap(int x,int y) int temp; temp-x; X-y, y-temp;
10.1指针变量作为函数形参——地址传递 特点:共享内存, “双向”传递 main() { int a,b; int swap(int,int); scanf("%d,%d",&a,&b); swap(a,b); printf("\n%d,%d\n",a,b); } swap(int x,int y) { int temp; temp=x; x=y; y=temp; } . . 2000 2016 2020 2004 2008 2012 5 变量a 变量b (main) 9 变量temp 变量y 变量x (swap) 5 5 95 9 COPY 例 交换两数并输出 方法一:

10.1指针变量作为函数参数一地址传递 特点:共享内存,“双向”传递 例交换两数并输出 方法一: (main) main() 2000 变量a int a,b; 2004 5 变量b int swap(int,int); 9 2008 2012 swap(a,b); 值传递 2016 printf("\n%od,% 单向传值 2020 swap(int x,int y) int temp; temp=x; X-y; y=temp; 运行结果:5,9
10.1指针变量作为函数参数——地址传递 特点:共享内存, “双向”传递 main() { int a,b; int swap(int,int); scanf("%d,%d",&a,&b); swap(a,b); printf("\n%d,%d\n",a,b); } swap(int x,int y) { int temp; temp=x; x=y; y=temp; } 例 交换两数并输出 方法一: 值传递 单向传值 . . 2000 2016 2020 2004 2008 2012 5 变量a 变量b (main) 9 运行结果:5, 9

例交换两数并输出 方法二: main() int a,b; (main) 2000 整型变量a int *pointer 1,*pointer 2; 9 2004 整型变量b int swap(int,int); 5 scanf("%d,%d",&a,&b); 2008 指针pointer_I 2000 pointer_1=&a;pointer_2=&b; 2012 指针pointer_2 swap(pointer_1.pointer 2)cOP 2016 2004 printf"n%d,%dn",a,b); 2020 (swap) 指针pl 2000 Q} 2024 ←一指针p2 swap(int *pl,int *p2) 2004 2028 整型t int t; 5 =*pl; *pl=*p2; *p2=t;
main() { int a,b; int *pointer_1,*pointer_2; int swap(int,int); scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; swap(pointer_1,pointer_2); printf(" \n%d,%d\n",a,b); } swap(int *p1, int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } . 2000 2016 2020 2004 2008 2012 2024 2028 . . 59 整型变量 a 整型变量 b (main) 指针pointer_1 指针pointer_2 2000 2004 (swap) 指针p1 指针p2 整型 t 59 2000 2004 COPY 5 例 交换两数并输出 方法二:

例交换两数并输出 方法二: main() int a,b; (main) 2000 整型变量a int *pointer 1,*pointer 2; 9 2004 整型变量b int swap(int,int); 5 scanf("%d,%d",&a,&b); 2008 指针pointer_I 2000 pointer_1=&a;pointer_2=&b; 2012 指针pointer_2 2004 swap(pointer_1,pointer_2); 2016 printf("n%d,%d"ab) 2020 地址传递 swap(int *p1,int p2) int t; t=*pl; *pl=*p2; *p2=t, 运行结果:9,5
main() { int a,b; int *pointer_1,*pointer_2; int swap(int,int); scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; swap(pointer_1,pointer_2); printf(" \n%d,%d \n",a,b); } swap(int *p1, int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } . 2000 2016 2020 2004 2008 2012 . . 59 整型变量 a 整型变量 b (main) 指针pointer_1 指针pointer_2 2000 2004 59 运行结果: 9 , 5 地址传递 例 交换两数并输出 方法二:

例交换两数并输出 方法二: 得到多个返回值给主程序的方法 main() 1、在主调函数设置 int a,b; n个普通变量xl、x2、x3.和 int *pointer 1,*pointer 2; n个指针变量pl、p2、p3 int swap(int,int); 2、将n个指针变量指向这n个普 scanf("%d,%d",&a,&b); 通变量。pl=&xlp2=&x2; pointer_1=&a;pointer_2=&b; 3、将这n个指针变量作为实参 swap(pointer_1,pointer 2); ,将其地址传递给所调用的自 printf("\n%od,%d n",a,b); 定义函数的形参。 4、在自定义函数中,设置n个 swap(int *p1,int *p2) 指针变量作形参,用来接受由 int t; 主调函数传递来的n个地址,通 t=*pl; 过改变自定义函数中的形参指 *pl=*p2; 针变量所指向的内存单元的值 *p2=t; ,来改变主调函数中变量x1、 x2、x3.的值
main() { int a,b; int *pointer_1,*pointer_2; int swap(int,int); scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); } swap(int *p1, int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } 例 交换两数并输出 方法二: 1、在主调函数设置 n个普通变量x1、x2、x3.和 n个指针变量p1、p2、p3. 2、将n个指针变量指向这n个普 通变量。p1=&x1;p2=&x2; . 3、将这n个指针变量作为实参 ,将其地址传递给所调用的自 定义函数的形参。 4、在自定义函数中,设置n个 指针变量作形参,用来接受由 主调函数传递来的n个地址,通 过改变自定义函数中的形参指 针变量所指向的内存单元的值 ,来改变主调函数中变量x1、 x2、x3.的值。 得到多个返回值给主程序的方法

10.2数组名作函数参数 #include <stdio.h 例 数组元素与数组名 void swap2(int x,int y) 作函数参数比较 int z; Z-X, X-y; y=z, 值传递 mainO) {inta[2]={1,2}; swap2(a[0],a[1]); printf("a[O]=%d\na[1]=%d\n",a[o],a[1]); a a a[O] 1 a[0] 2 1 a[1] 2 a[1] 2 2 2 调用前 调用 返回 交换
例 数组元素与 数组名 作函数参数比较 1 2 a 调用前 a[0] a[1] 1 2 a 调用 a[0] a[1] 1 2 x y 2 1 x y 交换 1 2 a 返回 #include void swap2(int x,int y) { int z; z=x; x=y; y=z; } main() { int a[2]={1,2}; swap2(a[0],a[1]); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); } 值传递 10.2 数组名作函数参数

10.2数组名作函数参数 例数组元素与数组名 #include <stdio.h 作函数参数比较 void swap2(int x[]) int z; z=x[0]; x[0]=x[1];x[1]=z, 三地址传递 main() {inta[2]={1,2; swap2(a); printf("a[0]=%dna[1]=%dn",a[0],a[1]); a a a 1 1 2 2 2 2 1 1 调用前 调用 交换 返回
1 2 a 调用前 1 2 a x 调用 2 1 a x 交换 2 1 a 返回 #include void swap2(int x[]) { int z; z=x[0]; x[0]=x[1]; x[1]=z; } main() { int a[2]={1,2}; swap2(a); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); } 地址传递 例 数组元素与 数组名 作函数参数比较 10.2 数组名作函数参数

10.2数组名作函数参数 例 数组元素与数组名 #include <stdio.h 作函数参数比较 void swap2(int *x) int z; Z=*X, *x=*(x+1)方*(X+1)=Z Q} main() 地址传递 {inta[2]={1,2}; swap2(a); printf("a[O]=%d\na[1]=%d\n",a[0],a[1]); a a a 1 X 2 2 2 2 1 1 调用前 调用 交换 返回
1 2 a 调用前 1 2 a x 调用 2 1 a x 交换 2 1 a 返回 #include void swap2(int *x) { int z; z=*x; *x=*(x+1); *(x+1)=z; } main() { int a[2]={1,2}; swap2(a); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); } 地址传递 例 数组元素与 数组名 作函数参数比较 10.2 数组名作函数参数

10.2数组名作函数参数 ·地址传递:函数调用时,将数据的存储地址作为参数传 递给形参 ·在主调函数与被调函数分别定义数组,且类型应一致 ·形参数组大小(多维数组第一维)可不指定 ·地址传递特点: 形参与实参占用同样的存储单元 “双向”传递 实参和形参必须是地址常量或变量
• 地址传递特点: 形参与实参占用同样的存储单元 “双向”传递 实参和形参必须是地址常量或变量 10.2 数组名作函数参数 • 地址传递:函数调用时,将数据的存储地址作为参数传 递给形参 • 在主调函数与被调函数分别定义数组,且类型应一致 • 形参数组大小(多维数组第一维)可不指定