chunlanse2014

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

第三节 指针变量作为函数参数(四)

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

【例10-3】题目同【例10-2】,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。

复制代码
 1 swap(int *p1,int *p2)
 2 {
 3     int temp;
 4     temp=*p1;
 5     *p1=*p2;
 6     *p2=temp;
 7 }
 8 main()
 9 {
10     int a,b;
11     int *pointer_1,*pointer_2;
12     scanf("%d,%d",&a,&b);
13     pointer_1=&a;pointer_2=&b;
14     if(a<b)
15         swap(pointer_1,pointer_2);
16     printf("\n%d,%d\n",a,b);
17 }
复制代码

 

对程序的说明:


1) swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。


2) 接着执行if语句,由于a<b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。


3) 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。函数调用结束后,p1和p2不复存在(已释放)。


4) 最后在main函数中输出的a和b的值是已经过交换的值。请注意交换*p1和*p2的值是如何实现的。

 



【例10-4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。

复制代码
 1 swap(int *p1,int *p2)
 2 {
 3     int *p;
 4     p=p1;
 5     p1=p2;
 6     p2=p;
 7 }
 8 main()
 9 {
10     int a,b;
11     int *pointer_1,*pointer_2;
12     scanf("%d,%d",&a,&b);
13     pointer_1=&a;pointer_2=&b;
14     if(a<b)
15         swap(pointer_1,pointer_2);
16     printf("\n%d,%d\n",*pointer_1,*pointer_2);
17 }
复制代码

 

其中的问题在于不能实现如图所示的第四步(d)。


【例10-5】输入a、b、c3个整数,按大小顺序输出。

复制代码
 1 swap(int *pt1,int *pt2)
 2 {
 3     int temp;
 4     temp=*pt1;
 5     *pt1=*pt2;
 6     *pt2=temp;
 7 }
 8 exchange(int *q1,int *q2,int *q3)
 9 {
10     if(*q1<*q2)
11         swap(q1,q2);
12     if(*q1<*q3)
13         swap(q1,q3);
14     if(*q2<*q3)
15         swap(q2,q3);
16 }
17 main()
18 {
19     int a,b,c,*p1,*p2,*p3;
20     scanf("%d,%d,%d",&a,&b,&c);
21     p1=&a;
22     p2=&b;
23     p3=&c;
24     exchange(p1,p2,p3);
25     printf("\n%d,%d,%d \n",a,b,c);
26 }
复制代码

 

posted on   chunlanse2014  阅读(433)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示