C语言-指针变量作为函数参数
指针变量作为函数参数
函数的参数类型不仅仅是整型,浮点型,字符型也可以是指针类型,它的作用是将一个变量的地址传到另外一个函数中,常见的是传数组的首地址。
提示:以下是本篇文章正文内容,下面案例可供参考
一、示例1
#include<stdio.h>
void swap(int *p1,int *p2);//函数的声明
int main()
{
int a,b;
int *m,*n;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
m = &a;
n = &b;
if(a<b) swap(m,n);
printf("max = %d,min = %d",a,b);
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
程序分析:
swap是用户自己定义的函数,其作用是交换两个变量a和b的值,swap函数中的两个形参p1和p2是指针变量。程序运行时,先执行main函数,输入a和b的值(例如输入5和9)。然后将a和b的地址赋给int*类型的m和n。使m指向a,n指向b。
接着执行if函数,由于a<b,执行swap函数,指针变量m将&a传给p1,n将&b传给p2,此时p1和p2分别指向a和b。
接着执行swap函数体,交换*p1
和*p2
的值,即a和b的值互换。
函数调用结束后,形参p1和p2释放,最后在main函数中输出的a和b的值已经是交换过的。
注意:注意*p1
和*p2
的值是如何实现的
如果改为如下就有问题
void swap(int *p1,int *p2)
{
int *temp;
*temp = *p1;
p1 = *p2;
p2 = *temp;
}
p1就是a,是整型变量。而temp是指针变量temp所指向的变量。但由于没有给temp赋值,因此temp中并无确定的值(它的值是不可遇见的),所以temp所指向的单元也是不可预见的。对*temp
赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储一个有用的数据,这样有可能会破坏系统的正常工作。
应该将*p1
的值赋给与*p1
相同类型的变量。
如果改为如下代码,能否实现变量交换呢?
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
如果在main函数调用swap函数
swap(a,b);
在函数调用时,a的值传给x,b的值传给y,在swap函数中实现了变量的交换,但是并没有影响到a和b交换。“单向传递”的“值传递”,形参值的改变不能改变实参的值。
为了使在函数中改变了变量值能被主调函数main所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使用指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”的目的。
如果想通过函数调用得到n个要改变的值,可以这样做:
- 在主调函数中设置n个变量,用n个指针变量指向它们。
- 设计一个函数,有n个变量,用n个指针指向它们。
- 在主调函数中调用这个函数,在调用时将这个n个指针变量作为实参,将它们的值,也就是相关变量的地址传给改函数的形参。
- 在执行该函数的过程中,通过形参执行变量,改变它们所指向的n个变量的值;
- 在主调函数中就可以使用这些改变了值的变量。
二、示例2
对输入的两个整数按大小顺序输出,尝试调用swap函数来实现题目的要求,在函数中改变形参(指针变量)的值,希望能由此改变实参(指针变量)的值。
#include<stdio.h>
void swap(int *p1,int *p2);//函数的声明
int main()
{
int a,b;
int *m,*n;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
m = &a;
n = &b;
if(a<b) swap(m,n);
printf("max = %d,min = %d",a,b);
}
void swap(int *p1,int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}
C语言中的实参变量和形参变量之间的数据传递是单向的“值传递”方式,用指针变量作为函数参数时同样需要遵循这一规则,不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
三、示例3
输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。采用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。
#include<stdio.h>
void exchange(int *q1,int *q2,int *q3);
void swap(int *pt1,int *pt2);
int main()
{
int a,b,c;
int *p1,*p2,*p3;
printf("please enter three numbers:");
scanf("%d,%d,%d",&a,&b,&c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1,p2,p3);
printf("The order is:%d,%d,%d\n",a,b,c);
return 0;
}
void exchange(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
exchange函数的作用是对3个数按大小排序,在执行exchange函数过程中,要嵌套调用swap函数,swap函数的作用是对两个数按大小排序,通过调用swap函数(最多调用3次)实现3个数的排序。
更多推荐
所有评论(0)