关于函数传参
以交换俩个数字的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:如果实参是指针,则传递指针的地址。—》形参则为二级指针