25_1 C++函数参数的传递

函数参数的传递方式(边练边学)

  在C++中,函数参数的传递方式主要有以下几种:值传递、指针传递、引用传递等。(请完整好以下代码,上机实践)

一、值传递(Pass by Value)

在值传递中,函数接收的是实参的一个副本。这意味着在函数内部对参数的修改不会影响原始数据。例如:

void increment(int x) {
    x++;
}
 
int main() {
    int a = 5;
    increment(a); // a的值不会改变
    return 0;
}

在这个例子中,increment函数接收a的副本,对副本的修改不会影响原始变量a。

二、指针传递(Pass by Pointer)

通过指针传递可以修改原始数据。函数接收的是指向变量的指针,通过这个指针可以访问和修改原始数据。例如:

void increment(int* x) {
    (*x)++; // 或者 x[0]++,如果x是指向数组的指针
}
 
int main() {
    int a = 5;
    increment(&a); // 现在a的值会改变
    return 0;
}

在这个例子中,increment函数通过指针修改了原始变量a的值。

三、引用传递(Pass by Reference)

引用传递与指针类似,但它使用的是引用而不是指针。通过引用传递,函数可以直接访问和修改原始数据。例如:

void increment(int& x) {
    x++;
}
 
int main() {
    int a = 5;
    increment(a); // 现在a的值会改变
    return 0;
}

在这个例子中,increment函数通过引用直接修改了原始变量a的值。使用引用比使用指针更安全,因为它自动处理了解引用操作,而且不需要手动管理内存。

4、常量引用传递(Pass by Const Reference)

当你不希望在函数内部修改原始数据时,可以使用常量引用传递。例如:

void printValue(const int& x) {
    std::cout << x << std::endl; // 输出值,但不修改它
}
 
int main() {
    int a = 5;
    printValue(a); // 输出a的值,但a的值不会改变
    return 0;
}

在这个例子中,printValue函数通过常量引用访问了a的值,但不能修改它。这提高了代码的安全性和清晰度。

5、数组和结构体的传递

数组:可以通过指针或引用传递数组,但不能直接传递整个数组(因为数组名在大多数表达式中会被解释为指向数组首元素的指针)。通常使用指针或标准库中的容器(如std::vector、std::array)。例如:使用指针:

void modifyArray(int* arr, int size) { /* ... */ }
//使用引用:
void modifyArray(int (&arr)[10]) { /* ... */ } // 限定数组大小10,这在C++11及之后版本是支持的语法糖。在C++98中通常使用指针。

//结构体:可以通过值、指针或引用传递结构体。例如使用引用:
struct MyStruct { /* ... */ };
void modifyStruct(MyStruct& s) { /* ... */ }

使用指针:
void modifyStruct(MyStruct* s) { /* ... */ }

使用值:结构体将以副本形式传递,除非结构体非常大或包含动态分配内存(在这种情况下应考虑使用指针或引用)。例如:使用值:

void modifyStruct(MyStruct s) { /* ... */ } // 注意:这将创建一个副本,除非MyStruct非常大或包含动态内存。

在C++中,通常推荐使用引用或指针来避免不必要的复制开销,尤其是在大型结构体或类的情况下。对于小的POD类型(Plain Old Data),值传递通常是可接受的。对于包含动态内存的类或大型对象,应考虑引用或指针以优化性能和避免不必要的复制。

特定详解

1、带默认形参值的函数

  在C++中,允许在自定义函数的形参列表中,给形参一个默认的值,这样在调用的时候如果有实参,那么按照实参传递给形参的方法使用;若调用的时候没有指定对应的实参,则形参将使用默认值。例如一个求加法的函数,代码如下:

#include<iostream>
using namespace std;
int add(int a=3,int b=5)
{
    return a+b;
}
int main()
{
    cout<<add(10,20)<<endl;//将10和20分别给a和b
    cout<<add(30)<<endl;//将30给a,b为默认的5
    cout<<add()<<endl;//使用a、b的默认值3和5
    return 0;
}

练习

1、自定义函数之字符串反转
题目描述:写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)。
输入格式:一行字符
输出格式:逆序后的字符串
样例输入:123456abcdef
样例输出:fedcba654321


学习参考

1、C++函数参数传递方式
2、C++ 值传递、指针传递、引用传递区别解析

posted @ 2025-07-28 12:10  gdyyx  阅读(34)  评论(0)    收藏  举报