指针变量作为函数参数

函数的参数类型不仅仅是整型,浮点型,字符型也可以是指针类型,它的作用是将一个变量的地址传到另外一个函数中,常见的是传数组的首地址。



提示:以下是本篇文章正文内容,下面案例可供参考

一、示例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个要改变的值,可以这样做:

  1. 在主调函数中设置n个变量,用n个指针变量指向它们。
  2. 设计一个函数,有n个变量,用n个指针指向它们。
  3. 在主调函数中调用这个函数,在调用时将这个n个指针变量作为实参,将它们的值,也就是相关变量的地址传给改函数的形参。
  4. 在执行该函数的过程中,通过形参执行变量,改变它们所指向的n个变量的值;
  5. 在主调函数中就可以使用这些改变了值的变量。

二、示例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个数的排序。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐