2025-03-06 学习记录--C/C++-C语言 函数参数传递的两种主要方法

奋斗不息每日新, 莫让此刻闲, 化作未来悔。💪🏻

C语言 函数参数传递的两种主要方法 👑

C 语言中,函数参数传递有两种主要方式:值传递地址传递

一、值传递(Pass by Value)🍭

(一)、定义 📚
  • 值传递 是指将实际参数的值复制一份,传递给函数的形式参数。
  • 函数内部对形式参数的修改不会影响实际参数。
(二)、特点 🐱

1、复制数据: ⭐️ ❥(^_-)

  • 实际参数的值会被复制到形式参数中。
  • 函数内部操作的是复制后的值,而不是原始数据。

2、不影响实际参数: ⭐️ ❥(^_-)

  • 函数内部对形式参数的修改不会影响调用函数中的实际参数。

3、适用于简单数据类型: ⭐️ ❥(^_-)

  • 通常用于传递基本数据类型(如 intfloatchar 等)。
(三)、举例 🌰
c 复制代码
#include <stdio.h>

// 值传递示例
void modifyValue(int x) {
    x = x + 10; // 修改形式参数的值
    printf("Inside function: x = %d\n", x);
}

int main() {
    int a = 5;
    modifyValue(a); // 将 a 的值传递给函数
    printf("Outside function: a = %d\n", a); // a 的值不变
    return 0;
}
(四)、分析 🪜
  • a 的值是 5,传递给 modifyValue 函数后,函数内部的 x 被修改为 15
  • 但函数外部的 a 仍然是 5,因为值传递不会影响实际参数。

二、地址传递(Pass by Address / Pass by Reference)🍭

(一)、定义 📚
  • 地址传递 是指将实际参数的地址传递给函数的形式参数。
  • 函数内部通过指针操作实际参数的值。
(二)、特点 🐱

1、传递地址: ⭐️ ❥(^_-)

  • 实际参数的地址被传递给形式参数(指针)。

2、影响实际参数: ⭐️ ❥(^_-)

  • 函数内部通过指针可以直接修改实际参数的值。

3、适用于复杂数据类型: ⭐️ ❥(^_-)

  • 通常用于传递数组、结构体或需要修改实际参数的情况。
(三)、举例 🌰
c 复制代码
#include <stdio.h>

// 地址传递示例
void modifyValueByAddress(int *x) {
    *x = *x + 10; // 通过指针修改实际参数的值
    printf("Inside function: *x = %d\n", *x);
}

int main() {
    int a = 5;
    modifyValueByAddress(&a); // 将 a 的地址传递给函数
    printf("Outside function: a = %d\n", a); // a 的值被修改
    return 0;
}
(四)、分析 🪜
  • a 的地址传递给 modifyValueByAddress 函数,函数内部通过指针修改了 a 的值。
  • 函数外部的 a 也被修改为 15,因为地址传递会影响实际参数。

三、值传递 vs 地址传递 🍭

特性 值传递 地址传递
传递内容 实际参数的值 实际参数的地址
函数内部操作 操作的是复制后的值 操作的是实际参数的值
是否影响实际参数 不影响 影响
适用场景 基本数据类型(intfloat 等) 数组、结构体、需要修改实际参数
性能 复制数据,可能消耗较多内存 传递地址,效率更高
1、实际应用场景 🌈
(1)值传递 🦋
  • 当函数不需要修改实际参数时,使用值传递。
  • 例如 🌰,计算两个数的和:👇🏻
c 复制代码
int add(int a, int b) {
    return a + b;
}
(2)地址传递 🦋
  • 当函数需要修改实际参数时,使用地址传递。
  • 例如 🌰,交换两个数的值:👇🏻
c 复制代码
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

四、总结 🍭

  • 值传递 🎀:传递的是实际参数的值,函数内部操作的是复制后的值,不影响实际参数。
  • 地址传递 🎀:传递的是实际参数的地址,函数内部通过指针操作实际参数的值,会影响实际参数。
  • 在实际编程中,根据需求选择合适的传递方式:👇🏻
    • 如果函数不需要 修改实际参数,使用值传递
    • 如果函数需要 修改实际参数,使用地址传递
相关推荐
(Charon)3 分钟前
【C++】手写 MySQL 连接池(三):异步任务队列与工作线程
c语言·c++
优化Henry1 小时前
5G基站开关电源故障导致小区频闪退服案例
学习·5g·信息与通信·tdd
加油码1 小时前
共享内存详解:原理、系统调用与高性能进程间通信
linux·c语言·c++
chenzhou__1 小时前
独立游戏开发日志 ①:从信号博弈到涂色对战——一次玩法重构始
笔记·后端·学习·unity·go·独立游戏
for_ever_love__1 小时前
iOS: 网络请求第三方库的使用: AFNetworking
网络·学习·ios·objective-c·cocoa·xcode
我叫唧唧波1 小时前
【Java】Java 基础系统学习笔记
java·笔记·学习
Lzh编程小栈1 小时前
【STM32底层精讲】RCC时钟系统超全详解(时钟树+源码+避坑指南)
c语言·stm32·单片机·嵌入式硬件·面试
Dobby_052 小时前
【CICD】Jenkins Pipeline 快速学习入门
运维·学习·jenkins
神秘的MT2 小时前
C# WinForm Socket 类 常用方法 (C# .NET,TCP 场景)
服务器·网络·学习·tcp/ip·c#·winform
艾莉丝努力练剑3 小时前
【MYSQL】MYSQL学习的一大重点:事务(上)- 原子性与持久性
android·数据库·学习·mysql·面试