#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("请输入两个需要交换的数:\n");//打印“请输入两个需要交换的数”字样
scanf("%d,%d",p,q);// 输入两个变量的值
printf("交换后的效果为:\n");// 打印“交换后的效果”字样
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("请输入需要交换的两个数:\n");
scanf("%d,%d",p,q);
printf("交换后的效果为:\n");
swap(p,q);
printf("%d,%d",*p,*q);
return 0;
}
void swap(int*a,int*b)
{ printf("我要查看1\n");
int *m;
printf("我要查看2\n");
*m=*a;
printf("我要查看3\n");
*a=*b;
printf("我要查看4\n");
*b=*m;
printf("我要查看5\n");
}
请输入需要交换的两个数:
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("请输入需要交换的两个数:\n");
scanf("%d,%d",&i,&j);
printf("交换后的效果为:\n");
swap(p,q);
printf("%d,%d\n",*p,*q);
return 0;
}
void swap(int *a,int *b)
{
int*m;
m=a;
printf("%d\n",*m);
a=b;
printf("%d\n",*a);
b=m;
printf("%d\n",*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("请输入需要比较的两个数:\n");
scanf("%d,%d",p,q);
printf("较大的数为:\n");
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将最大值输出
这种小程序显示不出函数指针的优点。不过用这种
程序能很好的锻炼和加深我们对指针的理解,熟练
掌握就是返回值时一定是指针类型,第一次运行时
还是返回了整型。应加深对指针的理解。