C语言指针操作(二)指针变量作为函数参数

这篇具有很好参考价值的文章主要介绍了C语言指针操作(二)指针变量作为函数参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

指针变量作为函数参数详解,形参和实参之间的值传递如何传递?如何改变指针变量所指向的变量?

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

关于地址,指针,指针变量可以参考一下这篇文章:

C语言指针操作(一)地址,指针,指针变量是什么

目录

一、引入

1.1改变指针变量的值

1.2改变指针变量所指向的值

二、程序练习

2.1程序实现

2.2程序分析


一、引入

我们先来看一个问题:输入整数 a 和 b,按大小先后顺序输出 a 和 b。

可以使用多种方法来处理这个这个问题

1.1改变指针变量的值

#include<stdio.h>
int main()
{
	int* p1, * p2, * p, a, b;	//定义指向整型的指针变量和整型变量
	printf("请输入两个整数:");
	scanf_s("%d,%d", &a, &b);
	p1 = &a;	//赋予a的地址,指向变量a
	p2 = &b;	//赋予b的地址,指向变量b
	if (a < b)	//如果a<b,交换p1和p2
	{
		p = p1;
		p1 = p2;
		p2 = p;
	}
	printf("a=%d, b=%d\n", a, b);	//输出a, b的值
	printf("max = %d, min = %d\n", *p1, *p2);	//输出指针变量p1和p2所指向的变量值
	return 0;
}

判断语句中也可以改为直接对 p1 和 p2 赋予新值,不用中间变量 p,使程序更加简练。

{
	p1 = &b;
	p2 = &a;
}

运行结果:

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

程序分析:

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

由图可知,指针变量 p1 和 p2 的值发生了交换,而变量 a,b的值未发生交换。

这种算法是不交换原来变量的值,而是交换指针变量的值。

1.2改变指针变量所指向的值

用指针变量作为函数参数

#include<stdio.h>
int main()
{
	void swap(int* p1, int* p2);
	int* point_1, * point_2, a, b;	//定义指向整型的指针变量和整型变量
	printf("请输入两个整数:");
	scanf_s("%d,%d", &a, &b);
	point_1 = &a;	//赋予a的地址
	point_2 = &b;	//赋予b的地址
	if (a < b)	//如果a<b,调用swap函数
	{
		swap(point_1, point_2);
	}
	printf("a=%d, b=%d\n", a, b);	//输出a, b的值
	printf("max = %d, min = %d\n", *point_1, *point_2);	//输出两个指针变量的值所指向的变量值
	return 0;
}

void swap(int* p1, int* p2)	//自定义函数,交换指针变量p1和p2
{
	int* temp;
	temp = p1;
	p1 = p2;
	p2 = temp;
}

运行结果:

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

程序分析:

由运行结果我们可以看出:变量 a 和 b 未发生交换,指针变量 point_1 和 point_2 的值也没有发生交换,那么函数 swap 到底实现交换功能了吗?我们将swap函数添加一个输出语句看一下结果。

void swap(int* p1, int* p2)	//自定义函数,交换指针变量p1和p2
{
	int* temp;
	temp = p1;
	p1 = p2;
	p2 = temp;
	printf("*p1 = %d, *p2 = %d\n", *p1, *p2);
}

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

可知在swap函数中,*p1 = 8,*p2 = 5;实现了交换的功能,但没有将改变的值传回去。

结合函数调用的知识,我们可以知道调用函数时,采取的是单向值传递,形参的改变不能使实参也随之改变。

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

由图可知,指针变量 point_1 和 point_2 的值没有发生交换,那么他们指向的变量也没有发生变化。

如果在函数中我们能使指针变量所指向的变量发生变化,那么就可以达到交换原变量的目的,此时而指针变量本身的值(即地址)不发生变换

我们对 swap 函数稍作修改,使它访问到指针变量所指向的变量。

void swap(int* p1, int* p2)		//自定义函数,交换指针变量所指向的变量*p1和*p2
{
	int temp;
	temp = *p1;		//交换*p1和*p2
	*p1 = *p2;
	*p2 = temp;
}

运行结果:

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

程序分析:

从结果我们可以看出,变量 a 和 b 发生了交换,也就是指针变量 point_1 和 point_2 指向的变量发生了交换。

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

由图可知,指针变量 point_1 和 point_2 的值(即地址 &a,&b)未发生变化,指针变量所指的变量(即变量 a,b)发生了变化。

这种算法是交换原来变量的值,而不交换指针变量的值。

这里需要注意的是中间变量 temp 的定义形式:

void swap(int* p1, int* p2)		//自定义函数,交换指针变量所指向的变量*p1和*p2
{
	int* temp;          //指针变量temp
	*temp = *p1;		//交换*p1和*p2
	*p1 = *p2;
	*p2 = *temp;
}

这时程序虽然语法上没有报错,但编译时会报错,*p1 就是 a,是整型变量,而 *temp 是指针变量 temp 所指向的变量,由于未给 temp 赋值,因此temp的值是无法确定的,所以temp所指向的存储单元也是未知的,因而 *temp = *p1 就是向一个未知的存储单元赋值,这是不合法的。

总结:

函数的调用只可以得到一个返回值,而使用指针变量作为参数,可以得到多个变化了的值。

二、程序练习

输入3个整数 a,b,c,要求按大小顺序将他们输出,用函数实现。

2.1程序实现

#include<stdio.h>
int main()
{
	void exchange(int* q1, int* q2, int* q3);	//声明函数,后面需要调用
	int a, b, c, * point_1, * point_2, * point_3;
	printf("请输入三个整数:");
	scanf_s("%d,%d,%d", &a, &b, &c);
	point_1 = &a; point_2 = &b; point_3 = &c;
	exchange(point_1, point_2, point_3);
	printf("Max = %d, Mid = %d, Min = %d\n", a, b, c);
	return 0;
}

void exchange(int* q1, int* q2, int* q3)	//自定义函数,交换3个变量的值
{
	void swap(int* p1, int* p2);		//声明函数,后面需要调用
	if (*q1 < *q2) { swap(q1, q2); }
	if (*q1 < *q3) { swap(q1, q3); }
	if (*q2 < *q3) { swap(q2, q3); }
}

void swap(int* p1, int* p2)		//自定义函数,交换指针变量所指向的变量*p1和*p2
{
	int temp;
	temp = *p1;		//交换*p1和*p2
	*p1 = *p2;
	*p2 = temp;
}

指针作为函数参数,C语言,c语言,算法,c++,数据结构,指针

2.2程序分析

exchange 函数的作用是对3个数按大小排序,在执行 exchange 函数过程中,要嵌套调用 swap 函数,swap 函数的作用是对两个数按大小排序,通过调用 swap 函数(最多调用3次)实现3个数的排序。

主函数中3个指针变量的值未发生改变,3个指针变量所指向的变量的值发生了改变。

要熟练掌握指针变量和指针变量所指向变量之间的关系,避免混淆!

C语言指针操作系列文章:

C语言指针操作(一)地址,指针,指针变量是什么

C语言指针操作(二)指针变量作为函数参数

C语言指针操作(三)通过指针引用数组

C语言指针操作(四)用数组名作函数参数

C语言指针操作(五)通过指针引用多维数组

C语言指针操作(六)通过指针引用字符串

C语言指针操作(七)指向函数的指针

C语言指针操作(八)返回指针值的函数

C语言指针操作(九)指针数组和多重指针

C语言指针操作(十)动态内存分配与指向它的指针变量

C语言指针操作(十一)有关指针的小结文章来源地址https://www.toymoban.com/news/detail-759413.html

到了这里,关于C语言指针操作(二)指针变量作为函数参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包