在编程中,形参(formal parameter)和实参(actual argument)是关于函数调用的两个重要概念:
形参(Formal Parameter):
形参是函数定义中声明的参数,它们用于指定函数接受的输入。
形参通常出现在函数的参数列表中,作为函数的参数定义,指定参数的名称和数据类型。
形参充当函数内部局部变量的角色,可以在函数内部使用,但它们的值通常是在函数调用时由实参传递进来的。
例如,在下面的函数定义中,x 和 y 是形参:
void add(int x, int y) {
int result = x + y;
// ...
}
实参(Actual Argument):
实参是在函数调用时传递给函数的值或表达式,它们用来提供函数所需的输入数据。
实参通常出现在函数调用表达式中,传递给函数的参数值应该与形参的类型和顺序相匹配。
例如,在下面的函数调用中,5 和 3 是实参:
int result = add(5, 3); // 5和3是实参
在函数调用时,实参的值会被传递给对应的形参,从而使函数能够使用这些值执行其操作。实参和形参之间的匹配通常基于它们的顺序和数据类型,这种匹配是必须的,以便正确传递数据到函数中。
实参提供了函数所需的具体数据,而形参充当接收这些数据的容器。函数的目的是使用形参执行特定的操作,以产生所需的结果。
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该
函数运行结束的时候形参被释放,而实参内容不会改变。
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
例如:
1.
void func1(int* p)
{
*p = 10;
}
int main()
{
//要改变int,传int的地址
int a = 0;
func1(&a);
printf("a=%d\n", a);
return 0;
}
2.//这是个结构体
void func3(SLTNode* pnode)
{
pnode->next = NULL;
}
//要改变结构体,传结构体的地址
int main()
{
SLTNode node;
func3(&node);
return 0;
}
如图所示a的值被修改了
如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身
3.//指针
void func2(int** pp)
{
*pp = malloc(sizeof(int)*10);
}
//要改变int*,传int*的地址
int main()
{
int* ptr = NULL;
func2(&ptr);
return 0;
}
4.//结构体指针
void func4(SLTNode** ppnode)
{
*ppnode= NULL;
}
int main()
{
//要改变结构体指针,传结构体的指针的地址
SLTNode* pnode;
func4(&node);
return 0;
}
简而言之就是
最重要的是:形参的改变不影响实参