指针变量作为函数参数

1、首先来看一个例子

输入a、b两个整数,按先大后小的顺序输出a和b。
代码:

#include<stdio.h>
int main()
{
	int *p1,*p2,*p,a,b;
	printf("Please enter two integer number:");
	scanf("%d %d",&a,&b);
	p1 = &a;
	p2 = &b;
	if(a<b)
	{
		p = p1;
		p1 = p2;
		p2 = p;
	}
	printf("a = %d b = %d\n",a,b);
	printf("max = %d min = %d\n",*p1,*p2);
	return 0;
}

运行结果:
在这里插入图片描述
代码分析:
可以看到,a和b的值并没有改变,但是p1和p2的值已经发生了改变。
在这里插入图片描述

2、现在,用函数实现

用指针变量作为函数的参数,它的作用是将一个变量的地址传送到另一个函数中
代码:

#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *pointer_1,*pointer_2;
	printf("Please input two integer numbers: ");
	scanf("%d %d",&a,&b);
	pointer_1 = &a;
	pointer_2 = &b;
	if(a<b)
	  swap(pointer_1,pointer_2);
	printf("max = %d  min = %d\n",a,b);
	return 0;
}

void swap(int *p1,int *p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

运行结果:
在这里插入图片描述
代码分析:
此程序采用的方法是交换a和b的值,而而p1和p2的值没有改变,p1仍然指向a,p2仍然指向b。
在这里插入图片描述

为了使在函数中改变的变量的值能被主调函数main使用,应该用指针变量作为函数的参数,在函数的执行过程中,使指针变量所指向的变量的值发生变化,函数调用结束后,这些变量的值的变化依然保留了下来。 这样就可实现:通过调用函数使变量的值发生变化,在主调函数中可以使用这些改变了的值。
注意,不能企图通过改变指针形参的值而使指针实参的值改变。如下例子:
代码:

#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *pointer_1,*pointer_2;
	printf("Please input two integer numbers: ");
	scanf("%d %d",&a,&b);
	pointer_1 = &a;
	pointer_2 = &b;
	if(a<b)
	  swap(pointer_1,pointer_2);
	printf("max = %d  min = %d\n",*pointer_1,*pointer_2);
	return 0;
}

void swap(int *p1,int *p2)
{
	int *p;
	p = p1;
	p1 = p2;
	p2 = p;
}

运行结果:
在这里插入图片描述
代码分析:
在这里插入图片描述
在C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作为函数参数时同样遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向的变量的值。 函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作为函数参数,可以得到多个变化了的值。要善于利用指针。

3、感悟

其实,把指针变量作为函数参数进行传递的时候,当实参传递到形参后。此时,对于实参所指向的变量的值,有两个指针变量指向它,一个是实参,一个是形参。也就是说,变量的值有两种方式可以使用它。在函数中,形参使用变量的值,并且改变它。由于实参也指向这些变量,因此实参所指向的值自然也就改变了。变量是固定的,在内存中只有“一个”。而指向它的指针变量(使用它的值的方式)却有两种(实参和形参),当其中的一种方式改变了变量的值的时候,这个“唯一的”变量的值就改变了,而对于指向它的其他指针变量来说,指向的值就改变了。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值