📜  C C++中的参数和参数之间的差异以及示例(1)

📅  最后修改于: 2023-12-03 14:39:37.614000             🧑  作者: Mango

C 中的参数和参数之间的差异以及示例
参数

在 C 中,函数的参数表示传递给函数的值,并在函数中使用。C 中的函数可以没有参数,也可以有任意数量的参数。函数的参数机制有以下四种:

  1. 值传递
  2. 引用传递
  3. 指针传递
  4. 结构体传递

值传递是指将实参的值复制一份到形式参数中,函数在调用时只是对形参进行操作,不会影响实参的值。参数和参数之间没有任何关系,

#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 中,函数的参数之间有一些差异,包括参数类型、作用范围、存储位置等:

  1. 基本类型参数

对于基本类型的参数,每个参数都是独立的,不会与其他参数产生关联。参数的作用范围只在函数内部,出了函数就失效。参数的存储位置在栈空间中。

void func(int a, int b)
{
    // a 和 b 都是独立的
}
  1. 数组和指针参数

数组和指针参数,可以认为是传递了一个地址,因此参数的类型是指针类型。可以通过指针来访问数组元素或数据结构。由于参数是指针类型,因此参数在函数内部的作用范围不仅限于函数内部,可以在函数外部使用,而且参数的值也可以被函数修改。参数的存储位置在栈空间中。

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
  1. 结构体参数

使用结构体参数的情况与数组和指针参数类似,需要传递一个结构体的地址。结构体参数可以包含多个成员,每个成员都可以通过结构体指针来访问。参数的作用范围在函数内部,出了函数后失效。参数的存储位置在栈空间中。

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 相同的函数参数机制,但有一些新特性:

  1. 默认参数
  2. 函数重载
默认参数

默认参数是指在定义函数时为参数提供一个默认值,这种函数的调用可以省略为其提供实参的参数。在 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