#include<stdio.h>//定义头文件 int main()// 定义主函数 {int i,j;// 定义变量i,j int*p,*q; // 定义指针变量p,q void swap(int*a,int*b);// 声明交换函数 p=&i;// 将指针指向变量i q=&j;// 将指针指向变量j printf("请输入两个需要交换的数: ");//打印“请输入两个需要交换的数”字样 scanf("%d,%d",p,q);// 输入两个变量的值 printf("交换后的效果为: ");// 打印“交换后的效果”字样 swap(p,q);// 调用交换函数 printf("%d,%d",*p,*q);// 将交换后的效果打印出来 return 0; // 返回整型数值 } void swap(int*a,int *b)// 交换函数的定义 {int m;// 定义局部变量m m=*a;//将指针指向的变量传给m *a=*b;// 将指针 b指向的变量传给指针a所指向的变量 *b=m;// 将m传给指针b所指的变量 }
请输入两个需要交换的数: 45,78 交换后的效果为: 78,45 -------------------------------- Process exited after 9.302 seconds with return value 0 请按任意键继续. . .
总结:
这个程序通过将变量的地址传给交换函数的形参,通过地址交换输入的变量,
形参和实参的指向是同样的地址,达到交换的目的,运行时的错误就是入输入
交换变量时中间的逗号格式必须是英文格式,不然将出现错误。
课堂问题一:
#include<stdio.h> int main() {int i,j; int*p,*q; p=&i; q=&j; void swap(int*a,int*b); printf("请输入需要交换的两个数: "); scanf("%d,%d",p,q); printf("交换后的效果为: "); swap(p,q); printf("%d,%d",*p,*q); return 0; } void swap(int*a,int*b) { printf("我要查看1 "); int *m; printf("我要查看2 "); *m=*a; printf("我要查看3 "); *a=*b; printf("我要查看4 "); *b=*m; printf("我要查看5 "); }
请输入需要交换的两个数: 45,78 交换后的效果为: 我要查看1 我要查看2 -------------------------------- Process exited after 13.63 seconds with return value 3221225477 请按任意键继续. . .
解释:
程序运行到定义完局部指针变量后,程序被系统阻止而代码编译
时没有问题,定义指针后,如果不对其进行初始化,指针的指向
是任意的,它可能指向系统中某个重要数据,对该指针直接赋值,
会改变系统中其他未知数据,影响其他程序的运行,出于安全考
虑,系统会阻止我们这样做 ,因此这样的程序无法运行。若是系
统不阻止,我猜程序能运行。
课堂问题二:
#include<stdio.h> int main() {int i,j; int*p,*q; p=&i; q=&j; void swap(int *a,int *b); printf("请输入需要交换的两个数: "); scanf("%d,%d",&i,&j); printf("交换后的效果为: "); swap(p,q); printf("%d,%d ",*p,*q); return 0; } void swap(int *a,int *b) { int*m; m=a; printf("%d ",*m); a=b; printf("%d ",*a); b=m; printf("%d ",*b); }
请输入需要交换的两个数: 45,78 交换后的效果为: 45 78 45 45,78 -------------------------------- Process exited after 7.94 seconds with return value 0 请按任意键继续. . .
解释:
这个调用函数原本想用交换地址的方式,达到交换变量的目的,
通过打印出的调用函数中各指针的指向可以看出各指针的指向,
但这程序实参向形参实际上就是个值传递 ,形参只是个实参的
拷贝,交换的只是拷贝过去的数,与原来的实参无关。所以调用
函数后任然是原来的顺序。
通过指针输出最大值:
#include<stdio.h> int main() {int i,j; int*p,*q,*c; p=&i; q=&j; int*swap(int*a,int*b);//定义函数指针 ,让函数返回指针类型数据 printf("请输入需要比较的两个数: "); scanf("%d,%d",p,q); printf("较大的数为: "); c=swap(p,q);//将函数的返回值赋值给指针变量c printf("%d",*c); return 0; } int*swap(int*a,int*b) {if(*a<*b) return b;//返回指针变量 else return a; }
请输入需要比较的两个数: 45,78 较大的数为: 78 -------------------------------- Process exited after 5.187 seconds with return value 0 请按任意键继续. . .
总结:
本程序利用函数指针将返回值类型定义为指针类型,
并将返回值赋值给指针变量c,通过c将最大值输出
这种小程序显示不出函数指针的优点。不过用这种
程序能很好的锻炼和加深我们对指针的理解,熟练
掌握就是返回值时一定是指针类型,第一次运行时
还是返回了整型。应加深对指针的理解。