C++中的按值传参、按引用传参、按指针传参

本文详细探讨了C++中三种参数传递方式:按值传递、按引用传递和按指针传递。通过一个具体的示例——交换两个整数的值,展示了不同传递方式下变量的变化情况及内存操作原理。实验结果显示,按引用和按指针传递能够成功交换外部变量的值,而按值传递则只改变了局部变量的副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序的功能是交换两个参数的值:
以下是源程序:

#include <iostream>
void swapr(int &a,int &b);//按引用传递
void swapp(int *p ,int *q);//按指针传递
void swapv(int a,int b);//按值传递
int main()
{
    using namespace  std ;
    int wallet_1 = 200;
    int wallet_2 = 300;
    cout << "wallet_1 = " << wallet_1 << endl;
    cout << "wallet_2 = " << wallet_2 << endl;

    cout << "Using reference to swap 
    contents : \n";
    swapr(wallet_1,wallet_2);
    cout << "wallet_1 = " << wallet_1 << endl;
    cout << "wallet_2 = " << wallet_2 << endl;

    cout << "Using pointer to swap 
    contents : \n";
    swapp(&wallet_1,&wallet_2);
    cout << "wallet_1 = " << wallet_1 << endl;
    cout << "wallet_2 = " << wallet_2 << endl;

    cout << "Tring to use passing by value \n";
    swapv(wallet_1,wallet_2);
    cout << "wallet_1 = " << wallet_1 << endl;
    cout << "wallet_2 = " << wallet_2 << endl;
}
void swapr(int &a,int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
void swapp(int *p, int *q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
void swapv(int a, int b)
{
    int temp ;
    temp = a;
    a = b;
    b = temp;
}

以下是程序的运行结果:
在这里插入图片描述
程序中共有四次打印输出:
第一次打印输出的结果是原数据。
第二次调用了函数,使用按指针传递,交换了两个参数的值。
第三次按引用传递,两个参数的值也交换了。因为引用是变量的别名。
第四次时按值传递,在程序运行的过程中,建立的变量的副本,原先的数据并没有改变。

### C++ 中通过指针传递字符串参数 在 C++ 中,可以通过指针将字符串作为参数传递给函数。由于 C 风格的字符串是以字符数组的形式存储,并以 `\0` 结尾表示结束位置,因此可以利用字符指针 `char*` 来处理这些字符串。 #### 字符串作为指针参数的示例代码 以下是一个简单的例子,展示如何使用指针传递字符串并对其进行修改: ```cpp #include <iostream> using namespace std; // 函数定义:接受一个 char 类型的指针作为参数 void modifyString(char* str) { // 修改字符串的内容 for (int i = 0; str[i] != '\0'; ++i) { str[i] = toupper(str[i]); // 将每个字符转为大写 } } int main() { char myStr[] = "hello world"; // 定义一个可修改的字符串 cout << "调用函数前myStr的: " << myStr << endl; modifyString(myStr); // 调用函数,传递字符串 cout << "调用函数后myStr的: " << myStr << endl; return 0; } ``` #### 解析 1. **字符串的本质** 在上述代码中,`char myStr[] = "hello world"` 实际上创建了一个字符数组,并将其初始化为 `"hello world\0"`[^2]。当该数组被传递到函数 `modifyString` 时,实际上是传递了它的首地址(即第一个元素的位置)。这使得函数能够直接访问和修改原始字符串中的内容。 2. **指针的作用** 函数 `modifyString` 接收的是一个指向字符的指针 `char* str`。这意味着它可以遍历整个字符串直到遇到终止符 `\0`,并对其中的每一个字符进行操作。在这个例子中,我们使用标准库函数 `toupper()` 将所有字母转换成大写字母[^3]。 3. **注意事项** - 如果希望保护原字符串不被修改,则应考虑使用常量指针 `const char*` 或者复制一份新的字符串副本再进行修改。 - 对于不可变字符串字面量(如 `"hello world"`),尝试对其内容进行修改会导致未定义行为,因为它们通常位于只读内存区域[^1]。 --- ### 常见错误及解决方案 如果试图像下面这样编写程序: ```cpp void modifyString(const char* str); ... modifyString("hello"); ``` 则会出现编译器警告或运行时崩溃,原因是字符串字面量本身是不可更改的对象,任何企图改变的行为都是非法的。 为了安全起见,在实际开发过程中推荐如下做法之一: - 创建动态分配的空间; - 使用 STL 提供的数据结构如 `std::string` 替代裸指针管理方式; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值