# 3.C语言指针变量作为函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
【例10-3】题目同【例10-2】,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。
~~~
swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
main(){
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a<b) swap(pointer_1,pointer_2);
printf("\n%d,%d\n",a,b);
}
~~~
对程序的说明:
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的值是如何实现的。请找出下列程序段的错误:
~~~
swap(int *p1,int *p2){
int *temp;
*temp=*p1; /*此语句有问题*/
*p1=*p2;
*p2=temp;
}
~~~
请考虑下面的函数能否实现实现a和b互换。
~~~
swap(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}
~~~
如果在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?
【例10-4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
~~~
swap(int *p1,int *p2){
int *p;
p=p1;
p1=p2;
p2=p;
}
main(){
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a<b) swap(pointer_1,pointer_2);
printf("\n%d,%d\n",*pointer_1,*pointer_2);
}
~~~
其中的问题在于不能实现如图所示的第四步(d)。
![](http://www.lvtao.net/content/uploadfile/201404/2a170ab724fd9463f9e553d5774c728920140421043935.gif)
【例10-5】输入a、b、c3个整数,按大小顺序输出。
~~~
swap(int *pt1,int *pt2){
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
exchange(int *q1,int *q2,int *q3){
if(*q1<*q2)swap(q1,q2);
if(*q1<*q3)swap(q1,q3);
if(*q2<*q3)swap(q2,q3);
}
main(){
int a,b,c,*p1,*p2,*p3;
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b; p3=&c;
exchange(p1,p2,p3);
printf("\n%d,%d,%d \n",a,b,c);
}
~~~
- 前言
- 一. C语言概述
- 1.C语言的发展及其版本
- 2.C语言工作原理和运行机制
- 3.C语言编译器(开发工具|IDE)推荐
- 4.C语言的特点
- 5.第一个C语言程序
- 6.C语言输出函数(printf)和输入函数(scanf)
- 7.C语言程序的结构特点
- 8.C语言字符集
- 9.C语言词汇
- 二. C语言算法
- 1.什么是算法|算法的概念
- 2.简单的C语言算法举例
- 3.C语言算法的特性
- 4.用流程图表示算法
- 5.三种基本结构的流程图
- 6.用N-S流程图表示算法
- 7.用计算机语言表示算法
- 三. 数据类型和运算符
- 1.C语言的数据类型
- 2.C语言常量与变量
- 3.C语言整型数据
- 4.C语言实型数据
- 5.C语言字符型数据
- 6.C语言变量赋初值
- 7.C语言数据类型转换
- 8.C语言算术运算符和算术表达式
- 9.C语言赋值运算符和赋值表达式
- 10.C语言逗号运算符和逗号表达式
- 四. 顺序程序设计
- 1.C语言语句概述
- 2.C语言赋值语句详解
- 3.C语言数据的输入输出
- 4.C语言字符的输入输出
- 7.C语言顺序结构程序设计举例
- 五. 分支结构
- 1.C语言关系运算符和表达式
- 2.C语言逻辑运算符和表达式
- 3.C语言if语句详解
- 4.C语言switch语句的用法详解
- 5.C语言条件运算符和条件表达式
- 6.C语言分支结构程序举例
- 六. 循环控制
- 1.C语言循环控制概述
- 2.C语言goto语句以及用goto语句构成循环
- 3.C语言while语句的用法
- 4.C语言do-while语句的用法
- 5.C语言for语句用法详解
- 6.C语言几种循环的比较
- 7.C语言break和continue语句的用法
- 8.C语言循环控制程序举例
- 七. C语言数组
- 1.C语言一维数组的定义和引用
- 2.C语言二维数组的定义和引用
- 3.C语言字符数组及其应用
- 4.C语言常用字符串处理函数
- 5.C语言数组应用举例
- 6.C语言数组小结
- 八. C语言函数
- 1.C语言函数概述
- 2.C语言函数的定义
- 3.C语言函数的参数和返回值
- 4.C语言函数的调用
- 5.C语言函数的嵌套调用
- 6.C语言函数的递归调用
- 7.C语言数组作为函数参数
- 8.C语言局部变量和全局变量
- 9.C语言变量的存储类别
- 九. 预处理命令
- 1.C语言预处理概述
- 2.C语言无参数宏定义
- 3.C语言带参数宏定义
- 4.C语言文件包含命令
- 5.C语言条件编译详解
- 6.C语言预处理指令总结
- 十. C语言指针
- 1.C语言指针的概念
- 2.C语言指针变量
- 3.C语言指针变量作为函数参数
- 4.C语言指针变量的运算
- 5.C语言数组指针
- 6.C语言通过指针引用数组
- 7.C语言数组名作函数参数
- 8.C语言指向多维数组的指针
- 9.C语言字符串指针
- 10.C语言字符串指针变量与字符数组的区别
- 11.C语言函数指针变量
- 12.C语言指针型函数
- 13.C语言指针数组的概念
- 14.C语言指向指针的指针
- 15.C语言main函数参数
- 16.关于指针的总结
- 十一. 结构体和共用体
- 1.C语言结构体的定义
- 2.C语言结构类型变量的说明
- 3.C语言结构变量成员的表示方法
- 4.C语言结构变量的赋值
- 5.C语言结构变量的初始化
- 6.C语言结构体数组的定义
- 7.C语言指向结构体变量的指针
- 8.C语言指向结构体数组的指针
- 9.C语言结构体指针变量作函数参数
- 10.C语言动态存储分配
- 11.C语言链表的概念
- 12.C语言枚举类型
- 13.C语言类型定义符typedef
- 十二. 位运算
- 1.C语言位运算符详解
- 2.C语言位域(位段)
- 3.关于位运算的总结
- 十三. 文件操作
- 1.C语言文件概述
- 2.C语言文件指针
- 3.C语言文件的打开与关闭
- 4.C语言文件的读写
- 5.C语言文件的随机读写
- 6.C语言文件检测函数
- 7.C语言库文件(头文件)有哪些
- 8.文件操作小结