【C语言】传值调用与传址调用详解


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C语言

文章目录

  • 💯前言
  • 💯传值调用
    • 1. 什么是传值调用?
    • 2. 示例代码:传值调用失败的情况
      • 执行结果:
    • 3. 为什么传值调用无法修改外部变量?
  • 💯传址调用
    • 1. 什么是传址调用?
    • 2. 示例代码:传址调用成功的情况
      • 执行结果:
    • 3. 为什么传址调用能够修改外部变量?
  • 💯传值调用与传址调用的比较
    • 1. 传值调用的优缺点:
    • 2. 传址调用的优缺点:
  • 💯传值调用与传址调用的应用场景
  • 💯小结

在这里插入图片描述


在这里插入图片描述


💯前言

  • 在C语言的学习过程中,理解函数的参数传递方式是非常重要的概念。C语言支持两种常见的参数传递方式:传值调用(Call by Value)和传址调用(Call by Address)。这两种方式在程序中有着不同的行为和应用场景,因此掌握它们的差异和用法对于编写高效、正确的代码至关重要。本文将详细分析这两种参数传递方式,并通过代码示例帮助读者深入理解。
    在C语言中,函数在被调用时会接收参数。参数传递是指在函数调用时,函数的输入数据(参数)如何从调用者传递到被调用的函数。传值调用和传址调用是两种常见的传递方式,它们的差别决定了函数能否改变传入参数的值。传值调用会将参数的副本传递给函数,而传址调用则将参数的地址传递给函数,从而使得函数可以直接修改原始参数。
    本文将通过代码示例和图示,详细分析这两种参数传递方式的工作原理,并探讨它们的优缺点和应用场景。
    C语言
    在这里插入图片描述

💯传值调用

1. 什么是传值调用?

传值调用是C语言中最常见的函数参数传递方式。在这种方式下,函数接收到的是参数的副本。换句话说,函数在调用时并不会修改原始参数,而是对参数的副本进行操作。

2. 示例代码:传值调用失败的情况

假设我们有一个函数 Swap,用于交换两个整数的值。在传值调用的情况下,我们尝试交换两个变量 ab

#include <stdio.h>

void Swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
}

int main() {
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);  // 用户输入两个整数
    printf("交换前: a=%d b=%d
", a, b);
    Swap(a, b);  // 传值调用
    printf("交换后: a=%d b=%d
", a, b);  // a 和 b 的值未改变
    return 0;
}

执行结果:

交换前: a=10 b=20
交换后: a=10 b=20

分析:

  • Swap 函数内部,参数 xy 仅仅是 ab 的副本。函数内对 xy 的交换操作不会影响到 main 函数中的 ab
  • 因为传入的是参数的副本,main 函数中的 ab 的值没有改变。

3. 为什么传值调用无法修改外部变量?

传值调用的核心问题是,它将参数的副本传递给函数,而不是变量本身。这意味着函数对副本所做的任何修改都不会影响外部变量。在上面的代码中,ab 被传递给了 Swap 函数的副本 xy,即使 xy 的值发生了交换,外部的 ab 仍然保持不变。

💯传址调用

1. 什么是传址调用?

与传值调用不同,传址调用会将变量的地址传递给函数,这样函数就能够直接修改原始变量的值。在传址调用中,传递的是变量的指针,函数通过指针访问并修改原始变量的内容。

2. 示例代码:传址调用成功的情况

下面是使用传址调用成功交换变量值的例子:

#include <stdio.h>

void Swap2(int *px, int *py) {
    int tmp = *px;  // 解引用指针,获取 px 指向的值
    *px = *py;      // 将 py 指向的值赋给 px 指向的变量
    *py = tmp;      // 将 tmp 的值赋给 py 指向的变量
}

int main() {
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);  // 用户输入两个整数
    printf("交换前: a=%d b=%d
", a, b);
    Swap2(&a, &b);  // 传址调用,传递 a 和 b 的地址
    printf("交换后: a=%d b=%d
", a, b);  // a 和 b 的值会成功交换
    return 0;
}

执行结果:

交换前: a=10 b=20
交换后: a=20 b=10

分析:

  • 这一次,Swap2 函数通过传递 ab 的地址,获得了指向 ab 的指针(即 pxpy)。通过解引用这些指针,函数能够直接修改 ab 的值。
  • Swap2 函数内部,交换操作成功影响了 main 函数中的 ab

3. 为什么传址调用能够修改外部变量?

传址调用通过传递参数的地址,使得函数能够直接操作外部变量。由于 Swap2 函数接受的是 ab 的指针,函数内部通过指针解引用修改了 ab 的值。这种修改是直接作用于原始变量的,而不是它们的副本。因此,外部变量的值得以改变。

💯传值调用与传址调用的比较

1. 传值调用的优缺点:

优点:

  • 安全性较高,因为函数内部不会直接修改外部变量的值。
  • 当参数较小且不需要在函数内部修改时,传值调用是更合适的选择。

缺点:

  • 传递大数据(如大数组或结构体)时会产生较大的内存开销,因为函数接收的是参数的副本。

2. 传址调用的优缺点:

优点:

  • 通过传递指针,可以直接修改外部变量,适用于需要在函数内修改外部变量的场景。
  • 对于大数据(如数组、结构体等),传址调用比传值调用更高效,因为不需要复制大量的数据。

缺点:

  • 由于函数可以修改外部变量,可能会带来一定的副作用,因此需要小心使用。
  • 指针操作相对复杂,可能导致指针悬挂、内存泄漏等问题。

💯传值调用与传址调用的应用场景

  • 传值调用:当函数不需要修改传入的参数,或者当参数是小型数据(如整数、浮点数等)时,传值调用是最常见且安全的选择。
  • 传址调用:当需要修改传入的参数,或者当参数较大(如数组、结构体等)时,传址调用更为高效。

💯小结

通过上述分析,我们深入探讨了C语言中两种常见的参数传递方式:传值调用传址调用。我们通过代码示例展示了它们在实际使用中的不同表现,并详细解释了它们的优缺点和应用场景。

  • 传值调用将参数的副本传递给函数,适用于不需要修改外部变量的情况。
  • 传址调用则通过传递地址,使得函数能够直接修改外部变量,适用于需要修改变量的场景,尤其是在处理大数据时更为高效。

希望通过本文的讲解,你能对这两种参数传递方式有一个清晰的认识,并能够在实际编程中灵活应用。如果你有其他问题或需要进一步的解释,欢迎随时向我提问!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

另外,实际编程经验对于加深理解至关重要。通过编写简单的程序(例如`计算器`、`猜数字游戏`、`排序算法`等),你可以巩固所学的理论知识。随着技能的提升,尝试实现更复杂的功能,甚至学习一些经典的数据结构与算法,如链表、栈、队列等。解决实际问题会帮助你更好地理解C语言的各种特性。阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。最后,学习C语言需要保持**耐心**和**持之以恒**的态度。它可能比其他高级编程语言更加底层、难度更高,但正是这种深入底层的学习使得你能够更好地理解计算机的运行机制,从而成为一名更出色的程序员。阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。**学习C语言**是每个程序员成长道路上的一大步。C语言不仅为许多其他高级语言提供了基础,还帮助我们更深入地理解计算机如何工作。下面是一些建议,可以帮助你更好地学习C语言。首先,掌握C语言的**基础**非常重要。你需要理解变量的声明、数据类型的使用、常见的运算符(如算术运算符、关系运算符等)以及基本的输入输出函数(如`printf`和`scanf`)。这些是任何程序的构建模块,也是深入学习其他高级特性(如指针和内存管理)的基础。其次,学习**指针**是C语言中的关键环节。指针是C语言强大功能的核心,它直接与内存操作相关。你需要理解指针的基本概念,如指针变量、指针与数组的关系、指针运算等。尤其是在处理动态内存分配、数组和字符串时,指针能够极大提升程序的性能和灵活性。通过动手实现一些指针相关的练习,逐步消除对指针的恐惧感。另外,实际编程经验对于加深理解至关重要。通过编写简单的程序(例如`计算器`、`猜数字游戏`、`排序算法`等),你可以巩固所学的理论知识。随着技能的提升,尝试实现更复杂的功能,甚至学习一些经典的数据结构与算法,如链表、栈、队列等。解决实际问题会帮助你更好地理解C语言的各种特性。阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。最后,学习C语言需要保持**耐心**和**持之以恒**的态度。它可能比其他高级编程语言更加底层、难度更高,但正是这种深入底层的学习使得你能够更好地理解计算机的运行机制,从而成为一名更出色的程序员。阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。**学习C语言**是每个程序员成长道路上的一大步。C语言不仅为许多其他高级语言提供了基础,还帮助我们更深入地理解计算机如何工作。下面是一些建议,可以帮助你更好地学习C语言。首先,掌握C语言的**基础**非常重要。你需要理解变量的声明、数据类型的使用、常见的运算符(如算术运算符、关系运算符等)以及基本的输入输出函数(如`printf`和`scanf`)。这些是任何程序的构建模块,也是深入学习其他高级特性(如指针和内存管理)的基础。其次,学习**指针**是C语言中的关键环节。指针是C语言强大功能的核心,它直接与内存操作相关。你需要理解指针的基本概念,如指针变量、指针与数组的关系、指针运算等。尤其是在处理动态内存分配、数组和字符串时,指针能够极大提升程序的性能和灵活性。通过动手实现一些指针相关的练习,逐步消除对指针的恐惧感。另外,实际编程经验对于加深理解至关重要。通过编写简单的程序(例如`计算器`、`猜数字游戏`、`排序算法`等),你可以巩固所学的理论知识。随着技能的提升,尝试实现更复杂的功能,甚至学习一些经典的数据结构与算法,如链表、栈、队列等。解决实际问题会帮助你更好地理解C语言的各种特性。阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。最后,学习C语言需要保持**耐心**和**持之以恒**的态度。它可能比其他高级编程语言更加底层、难度更高,但正是这种深入底层的学习使得你能够更好地理解计算机的运行机制,从而成为一名更出色的程序员阅读经典书籍如《C程序设计语言》(K&R)是学习C语言的好方法。这本书不仅详细讲解了C语言的基本语法,还介绍了C语言的内存管理和底层实现,适合初学者和有经验的程序员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发&#xff0c;当容器是ArkTS组件&#xff0c;子组件在Native侧创建时&#…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明&#xff0c;对于数据结构无非两大类结构&#xff1a;顺序结构、链式结构&#xff0c;而二叉树实质上就可以等效看作为一个二叉链表&#xff0c;而对于链表插入一个节点的操作是应…

Office/WPS接入DS等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆&#xff0c;成为全球最炙手可热的大模型&#xff0c;各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用&#xff0c;那如果有读者希望将大模型部署在本地应该怎么做呢&#xff1f;本篇文章将会教你如何在本地傻瓜式的部署我们的…

arcgis for js范围内天地图高亮,其余底图灰暗

在GIS地图开发中&#xff0c;有时我们需要突出显示某个特定区域&#xff0c;而将其他区域灰暗处理&#xff0c;以达到视觉上的对比效果。本文将介绍如何使用ArcGIS for JavaScript实现这一功能&#xff0c;具体效果为&#xff1a;在指定范围内&#xff0c;天地图高亮显示&#…

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

Docker深度解析:安装各大环境

安装 Nginx 实现负载均衡&#xff1a; 挂载 nginx html 文件&#xff1a; 创建过载目录&#xff1a; mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意&#xff1a;在挂载前需要对 conf/nginx.conf 文件进行编写 worker_processes 1;events {worker_connections 1024; …

Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试

第一种方式 1. 下载 Apache HTTP Server 源代码 首先&#xff0c;从 Apache 官网 下载最新版本的 httpd 2.4 源码&#xff0c;或者直接使用 wget 下载&#xff1a; [rootlocalhost ~]# wget https://downloads.apache.org/httpd/httpd-2.4.36.tar.gz # 解压 [rootlocalhost ~…

ARM嵌入式学习--第十三天(I2C)

I2C --介绍 I2C&#xff08;Inter-intergrated Circuit 集成电路&#xff09;总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信&#xff1b;I2C总线有俩根双向的信号线&#xff0c;一根数据线SDA用于收发数据&…

python爬虫--简单登录

1&#xff0c;使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…

C# 解决“因为算法不同,客户端和服务器无法通信”的问题

目录 故障现象 开发运行环境 解决 实现携带证书的 API URL调用 其它 故障现象 实现微信退款功能&#xff0c;我们需要在微信支付商户后台申请安全证书&#xff0c;并调用退款API URL。在调试过程中为增添返回调试信息属性&#xff0c;重新对.net FrameWorkd 类库进行编译…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接&#xff1a;https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下&#xff1a; ollama的安装 这里选择命令安装curl -fsSL …

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一&#xff1a; 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

高德地图python地理编码和geopandas应用判断坐标点空间位置

在本人另一篇文章&#xff08;高德地图地理编码python&#xff08;版本3.9&#xff09;爬虫&#xff08;含坐标转换及数据表模板&#xff09;-CSDN博客&#xff09;的基础上增加geopandas功能&#xff0c;使脚本能自动根据查找的高德地图坐标与现有的几何范围进行交互&#xff…

Pygame介绍与游戏开发

提供pygame功能介绍的文档&#xff1a;Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同&#xff0c;pygame提供了图形化使用界面GUI&#xff08;graphical user interface&#xff09;基于图像的界面可以创建一个有图像和颜色的窗口 要让py…

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。