【C语言>数据结构与算法的应用2】C语言中函数形参与实参的关系

形参

形参:在函数定义的函数首部()中,用“ , ”分隔的多个变量。
形参只有一种:变量。

void Exchange(int m, int n);

这个函数声明中有两个形参:m,n。

实参

实参:在函数调用时,()中用“ , ”分隔的多个表达式称为实参。
实参的种类有三种:常量、变量、表达式。

其实,我们用的最多的 printf() ,就是一个函数(打印函数),只不过这个函数是C语言开发者已经写好了,你每次使用printf(),都是在调用这个函数,类似的还有:scanf()函数,gets()函数,sizeof()函数,等等。

问:下面这段代码的主函数中有几个实参?

void main()
{
	int m, n;
	scanf("%d %d", &m, &n);
	printf("\n%d %d", m, n);
}

答:六个,
分析:
scanf("%d %d", &m, &n);这里有三个实参:"%d %d"(字符串常量);&m(表达式);&n(表达式)。
printf("\n%d %d", m, n);这里有三个实参:"\n%d %d"(字符串常量);m(变量);n(变量)。

形参与实参的关系

1、个数相同。 (就是在主函数里调用函数时,()里的实参个数,必须要和函数声明时,()里的形参个数相同)

2、实参按位置关系和形参一一对应。

3、相对应的形参和实参的类型必须相同。

4、值传递(将实参表达式的值复制一份,传递给形参。)

其实关于“值传递”的说法并不存在,对于计算机底层实现机制来说。但对于目前还没有学堆栈的同学来说,这种说法是非常有助于理解的。而且,实参与形参底层的实现机制可以变相的理解为“值传递”。

举例说明(形参与实参的关系

关于值传递的一个例题:交换两个数,用函数实现

这里有两个代码,来实现交换,那么那一个代码是正确的呢?

代码一:

#include<stdio.h>
#include<stdlib.h>

void Exchange(int a, int b); //函数声明

void Exchange(int a, int b) //函数定义,实现了两个数的交换
{
	int temp;

	temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a;
	int b;

	printf("请输入两个数:\n");
	sancf("%d %d", &a, &b);
	Exchange(a, b); //这里要传参a,b
	printf("\n下面是交换后的结果:\n");
	printf("%d %d", a, b);

	System("pause");
	return 0;
}

代码二:

#include<stdio.h>
#include<stdlib.h>

void Exchange(int* a, int* b); //函数声明

void Exchange(int* a, int* b) //函数定义,实现了两个数的交换
{
	int temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int a;
	int b;

	printf("请输入两个数:\n");
	sancf("%d %d", &a, &b);
	Exchange(&a, &b); //这里要传参应当是a,b的地址,因为实参和形参的关系是“值传递”
	printf("\n下面是交换后的结果:\n");
	printf("%d %d", a, b);

	System("pause");
	return 0;
}

看到这里,大家应该知道了,代码二是对的,因为只有传递的实参是指针,才可以通过指针来间接的改变 a,b的值。

二阶指针(形参与实参的一些应用

这是一个关于在链表中使用二阶指针的例子,主要体现了函数形参和实参的关系。

#include <stdio.h>
#include<calloc.h>

typedef struct POINT {
	int row;
	int col;
	struct POINT *next;
}POINT; //这里声明一个结构体类型

void inputPointLink(POINT **head); //函数声明

void inputPointLink(POINT **head) { //函数定义
	if (head == NULL || *head != NULL) {
		return FALSE;
	}
	// 做一大堆申请节点,构成链表的工作;
	*head = (POINT *) calloc(sizeof(POINT), 1);
	(*head)->next = NULL; //这里的*head就是head1
	// 继续构成链表其它节点........

	return TRUE;
}
int main()
{
	POINT *head1 = NULL;		// 形成一个空链
	
	inputPointLink(&head1); //函数调用,传递的实参为head1的地址,
	// 而head1就是地址(指针),所以形参类型应为指针的指针。
	
	return 0;
}

bye~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值