形参 实参 指针

形参 实参 指针

形参 实参
在学习C语言的过程中,大多浅尝辄止,点到为止,所以当有人问起你C语言怎么样,你会尬笑一下,说一句没有底气的话:“”“还行吧”,为了更深入的学习,今天开始记录一些知识点。

直接上代码

#include<stdio.h>
#pragma warning(disable: 4996)
int main()
{
	void swap(int,int);
	int x,y;
	printf("please input 2 numbers:\n");
	scanf("%d %d",&x,&y);
	swap(x,y);
	printf("changed two number is %d,%d\n",x,y);
	return 0;
}
/*
这里有值得注意的点:
当实参x y 代入swap函数去做计算的时候,并不是把x y本身代入了进去,只是将变量x对应的值赋给了形参a,将变量y对应的值赋给了形参b
x,y变量的值依然存在。“实参变量和形参变量中的数据传递是单向的”
这也就说明如果swap函数中没有printf函数时,在调用之后,主函数去输出x,y两个值并没有交换,因为实参和形参的赋值过程只是将实参的值做了传递
自定义函数中的确做了数值的交换,只不过交换的是形参的值,和主函数中的实参没有关系
*/
void swap(int a,int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
	printf("changed two number is %d,%d\n",a,b);//a
}

指针
指针是C语言的精华,什么是指针?什么是指针变量?指针简单来说就是一个变量的存放地址,指针变量首先是一个变量,它是专门用来存放地址的变量类型。在定义一个指针变量的时候,用*号来表明该变量是个指针变量,其次必须要指定类型,也就是说这个指针变量是用来存放哪种数据类型的,因为数据在存放时,系统分配的大小是不同的,比如int型分配4个字节,char型分配一个字节。
先贴代码:

#include<stdio.h>
#pragma warning(disable:4996)
//实现:输入两个整数,按大小顺序输出
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *pointer_1,*pointer_2;
	printf("please enter a and b:\n");
	scanf("%d,%d",&a,&b);
	pointer_1 = &a;
	pointer_2 = &b;
	if(a < b)
		swap(pointer_1,pointer_2);
	printf("max = %d\nmin = %d\n",a,b);
	return 0;
}

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

上面这段代码利用指针类型的数据作为函数参数实现了对整数大小判断并按顺序输出,值得注意的地方是,在swap函数声明参数时的※号是表明p1是一个指针变量,而在运算过程中temp = *p1;这里的※号有实际意义的,就是取指针变量p1指向的值。
首先分析下将a,b的地址分别赋值给了指针变量pointer_1和pointer_2,也就是说指针变量pointer_1指向a,指针变量pointer_2指向b,可以用下图1来理解:
图1
然后在判断之后,将实参变量传递给了形参变量调用函数,这样指针变量p1和p2又分别指向了a,b,也就是说a和b的地址都存在了两个变量中,通过任意一个对应的指针变量都可以找到,可以用下图2来理解:
图2
在函数调用之后,两个指针变量的值通过中间变量temp做了互换,也就是地址没有变,只是地址上的数值变了,相当于两个客房的住户调换了房间,但是门牌号没有变化。在函数调用结束之后,两个形参的内存被释放,则就不存在这两个指针变量,a和b的地址只有惟一的存放变量,可以用下图3来理解:
图3
在形参释放之后,可以理解为下图4:
图4
这样就通过指针完成了两个数值的交换,可以通过下面的代码对比理解。只改变了调用函数的内容。

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *pointer_1,*pointer_2;
	printf("please enter a and b:\n");
	scanf("%d,%d",&a,&b);
	pointer_1 = &a;
	pointer_2 = &b;
	if(a < b)
		swap(pointer_1,pointer_2);
	printf("max = %d\nmin = %d\n",a,b);
	return 0;
}

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

这里的swap函数中,交换了p1和p2的地址,而不是交换了变量值,关键是是做形参做了处理,但是没有输出形参的结果就释放掉了,可以理解为下图5:
图5
这样在形参消失后,对main函数的输出是没有影响的,或者可以不在main函数中输出,可以在swap中增加输出函数如:

void swap(int *p1,int *p2)
{
	int *temp;
	temp = p1;
	p1 = p2;
	p2 = temp;
	printf("max = %d\nmin = %d\n",*p1,*p2);
}

这里的笔记是在学习了谭浩强C程序设计之后做的总结。

猜你喜欢

转载自blog.csdn.net/qq_42387372/article/details/105778550
今日推荐