📅  最后修改于: 2023-12-03 14:39:37.614000             🧑  作者: Mango
在 C 中,函数的参数表示传递给函数的值,并在函数中使用。C 中的函数可以没有参数,也可以有任意数量的参数。函数的参数机制有以下四种:
值传递是指将实参的值复制一份到形式参数中,函数在调用时只是对形参进行操作,不会影响实参的值。参数和参数之间没有任何关系,
#include <stdio.h>
void func(int a, int b)
{
printf("a = %d, b = %d\n", a, b);
}
int main()
{
int x = 10, y = 20;
func(x, y);
return 0;
}
a = 10, b = 20
C 中的参数具有值传递的特点,因此在调用函数时,实参的值并不会被改变。
在 C 中,函数的参数之间有一些差异,包括参数类型、作用范围、存储位置等:
对于基本类型的参数,每个参数都是独立的,不会与其他参数产生关联。参数的作用范围只在函数内部,出了函数就失效。参数的存储位置在栈空间中。
void func(int a, int b)
{
// a 和 b 都是独立的
}
数组和指针参数,可以认为是传递了一个地址,因此参数的类型是指针类型。可以通过指针来访问数组元素或数据结构。由于参数是指针类型,因此参数在函数内部的作用范围不仅限于函数内部,可以在函数外部使用,而且参数的值也可以被函数修改。参数的存储位置在栈空间中。
void func(int *a, int *b)
{
*a = 10;
*b = 20;
}
int main()
{
int x = 0, y = 0;
func(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
x = 10, y = 20
使用结构体参数的情况与数组和指针参数类似,需要传递一个结构体的地址。结构体参数可以包含多个成员,每个成员都可以通过结构体指针来访问。参数的作用范围在函数内部,出了函数后失效。参数的存储位置在栈空间中。
struct Point {
int x;
int y;
};
void func(struct Point *p)
{
p->x = 10;
p->y = 20;
}
int main()
{
struct Point p = { 0, 0 };
func(&p);
printf("x = %d, y = %d\n", p.x, p.y);
return 0;
}
x = 10, y = 20
C++ 支持与 C 相同的函数参数机制,但有一些新特性:
默认参数是指在定义函数时为参数提供一个默认值,这种函数的调用可以省略为其提供实参的参数。在 C++ 中,可以将函数参数设置为默认参数。
默认参数允许我们在调用函数时少传递一些参数,当我们需要从函数中获取默认值时,可以不传递相应参数,而是使用默认参数代替。
#include <iostream>
using namespace std;
void func(int a, int b = 10)
{
cout << "a = " << a << ", b = " << b << endl;
}
int main()
{
func(1); // a = 1, b = 10
func(1, 2); // a = 1, b = 2
return 0;
}
C++ 支持函数重载,这意味着可以在同一个作用域中定义多个函数,名称相同但参数类型或数量不同,C++ 可以根据实际调用的函数来选择正确的函数。
函数重载提高了代码的可读性和灵活性,无需在函数名称中添加后缀或前缀完成类似功能的任务。
#include <iostream>
using namespace std;
void func(int a)
{
cout << "a = " << a << endl;
}
void func(double a)
{
cout << "a = " << a << endl;
}
void func(int a, double b)
{
cout << "a = " << a << ", b = " << b << endl;
}
int main()
{
func(10);
func(3.14);
func(1, 2.0);
return 0;
}
a = 10
a = 3.14
a = 1, b = 2