关于函数调用时形参与实参的情况
首先什么是形参与实参
形式参数:定义函数时函数名后括号中的变量名!
实际参数:调用函数时函数名后括号中的表达式!
1.形参未被调用时,不占存储单元。形参只在调用过程中占用存储单元。形参定义时必须指定类型!
2.实参是常量。变量或者表达式!要与形参类型一致!而且实参要有确定的值,占用储存单元,在调用过程中实参将值赋给形参!
3.C中实参对形参数据传递时时单向传递。在存储单元中是不同的单元
三种情况
情况一
#include<stdio.h>
void swap(int p,int q) { //p,q为形参
int temp = p;
p = q;
q = temp;
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a,b为实参
swap(a,b);
printf("%d %d",a,b);
}
在上面第三条性质中实参对形参数据传递时时单向传递,在存储单元中是不同的单元,所以在swap函数中并不能改变a,b的值
情况二
#include<stdio.h>
void swap(int *p,int *q) { //p,q为形参
int temp = *p;
*p = *q;
*q = temp;
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a,b为实参
swap(&a,&b);
printf("%d %d",a,b);
}
要想在swap函数里改变a,b值则使用指针
情况三
#include<stdio.h>
void swap(int *p,int *q) { //p为形参
printf("p = %d q = %d\n",p,q);
p = q;
printf("p = %d q = %d\n",p,q);
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a为实参
swap(&a,&b);
printf("&a = %d &b = %d\n",&a,&b);
printf("a = %d b = %d\n",a,b);
}
大家先思考一下结果会是什么,该情况是我们在函数实参与实参使用时经常出的BUG
注:(以上图的地址为例)在理解该情况实参与形参的指针与地址传递时
//在主函数开始swap函数传入a,b地址
p = &a; //该操作使a与p变量公用一块地址
q = &b; //该操作使b与q变量公用一块地址
//在swap函数里
p = q //使p与q公用一块地址,而p已经不与a用一块地址了,所以p的任何改变都与a无关,而与b有关
所以大家在函数中应注意地址改变与数值改变区别