不确定的实参变量可以被调用吗
发布网友
发布时间:2023-07-27 05:07
我来回答
共1个回答
热心网友
时间:2024-11-20 23:36
形式参数:定义函数时函数名后括号中的变量名!
实际参数:调用函数时函数名后括号中的表达式!
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);
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
在这里插入图片描述
在上面第三条性质中实参对形参数据传递时时单向传递,在存储单元中是不同的单元,所以在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);
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
在这里插入图片描述
要想在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有关
所以大家在函数中应注意地址改变与数值改变区别