关于函数传参

关于函数传参

以交换俩个数字的swap函数为例
在C语言中,函数传参有俩种方式:传值和传地址。
传值:形参是实参的一份临时拷贝,如果在函数中对形参进行修改,是不会改变外部的实参的。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdlib.h>
void swap1(int left, int right)
{
	int temp = left;
	left = right;
	right = temp;
}
int main() 
{
	int i = 10;
	int j = 20;
	swap1(i, j);
	printf("%d %d",i,j);
	system("pause");
}

在这里插入图片描述
传地址: 如果在函数中对形参指向的内容修改了,会改变外部的实参。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdlib.h>
void swap2(int *left, int *right)
{
	int temp = *left;
	*left = *right;
	*right = temp;
}
int main() 
{
	int i = 10;
	int j = 20;
	swap2(&i, &j);
	printf("%d %d",i,j);
	system("pause");
}

在这里插入图片描述

注意:

如果按照地址方式传参,在函数体中修改了指针指向空间中的内容,该改变可以体现在外部实参上。
如果按照地址方式传参,在函数体中修改了指针的指向,该改变不可以体现在外部实参上。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdlib.h>
void swap3(int *left, int *right)
{
	int *temp = left;
	left = right;
	right = temp;
}
int main() 
{
	int i = 10;
	int j = 20;
	swap3(&i, &j);
	printf("%d %d",i,j);
	system("pause");
}

在这里插入图片描述
为什么“如果按照地址方式传参,在函数体中修改了指针的指向,该改变不可以体现在外部实参上”呢?
因为指针是外部实参的一份拷贝,它的改变并不会影响外部实参。要想改变外部实参,必须传指针的地址,即使用二级指针(二级指针指向指针地址)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stdlib.h>
void swap4(int *left, int *right)
{
	int temp = *left;
	*left = *right;
	*right = temp;
}
int main() 
{
	int i = 10;
	int j = 20;
	int *left, *right;
	left = &i;
	right= &j;
	swap4(&i, &j);
	printf("%d %d",i,j);
	system("pause");
}

在这里插入图片描述

总结:

1、无论按照什么方式传参,将来形参都是实参的一份拷贝
2、如果在函数体中想要通过形参来改变实参,则必须传递实参的地址:

a:如果实参是变量,则传递变量的地址。—》形参则为一级指针
b:如果实参是指针,则传递指针的地址。—》形参则为二级指针

发布了34 篇原创文章 · 获赞 2 · 访问量 941

猜你喜欢

转载自blog.csdn.net/weixin_44091229/article/details/104558419