关于函数调用时形参与实参的情况

关于函数调用时形参与实参的情况

首先什么是形参与实参

形式参数:定义函数时函数名后括号中的变量名!
实际参数:调用函数时函数名后括号中的表达式!

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有关

所以大家在函数中应注意地址改变与数值改变区别

发布了37 篇原创文章 · 获赞 36 · 访问量 3601

猜你喜欢

转载自blog.csdn.net/qq_43799957/article/details/104585650