C 按值传递数组与按引用传递数组

2023-12-05

大家好,我一直在学习 C,我遇到了这个例子,但我并没有真正找到背后的逻辑。这不是关于代码的技术问题,我更多地寻找解释。 这是代码

#include <stdio.h>

void set_array(int array[4]);
void set_int(int x);

int main(void)
{
    int a = 10;
    int b[4] = {0, 1, 2, 3};
    set_int(a);
    set_array(b);
    printf("%d %d\n", a, b[0]);
}

void set_array(int array[4])
{
    array[0] = 22;
}

void  set_int(int x)
{
    x = 22;
}

输出是10 22

基本上我的问题是为什么从 set_array 函数传递的 22 重写 b 数组上的 0 并实际打印,但从 set_int 函数传递的 22 没有传递或打印。

谢谢你们!


在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。如果将对象直接传递给函数,则该函数将处理该对象值的副本。

比较此演示程序中的两个函数调用。

#include <stdio.h>

void f( int x )
{
    x = 10;
}

void g( int *x )
{
    *x = 10;
}


int main(void) 
{
    int x = 0;

    printf( "Before call f: x = %d\n", x );

    f( x );

    printf( "After  call f: x = %d\n", x );

    putchar( '\n' );

    printf( "Before call g: x = %d\n", x );

    g( &x );

    printf( "After  call g: x = %d\n", x );

    return 0;
}

程序输出是

Before call f: x = 0
After  call f: x = 0

Before call g: x = 0
After  call g: x = 10

那就是我们传递给函数f物体x直接地。所以该函数处理对象的副本x。更改副本不会影响原始对象x在 main 中声明。

至于功能g然后它就可以访问该对象x间接通过指向它的指针。所以改变指向的对象我们改变了对象x在 main 中声明。

对于数组,当数组传递给函数时,它会隐式转换为指向其第一个元素的指针。所以该函数实际上是通过 this 指针通过引用获取数组的元素。使用指针和指针算术,我们可以更改数组的任何元素。

这个函数声明

void set_array(int array[4]);

等价于下面的声明

void set_array(int array[]);

并且两个声明都由编译器调整为声明

void set_array(int *array);

因此该函数处理一个指针——指向用作函数调用参数的数组第一个元素的指针。

程序中函数set_array的调用

set_array(b);

相当于下面的调用

set_array( &b[0] );

因为在表达式中使用的数组(例如作为函数参数表达式)会隐式转换为指向其第一个元素的指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 按值传递数组与按引用传递数组 的相关文章

  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • Dapper 在执行时挂起

    我有一个 IDb连接 sql UPDATE 表名 SET json json lastupdate SYSDATE WHERE id id var param new DynamicParameters param Add json jso
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加

随机推荐

  • 黑莓 - 裁剪图像

    我想裁剪图像的一部分 为此我使用以下代码 int x 20 int y 50 int rgbdata new int 0 width x height y image getWidth image getARGB rgbdata 0 ima
  • 如何在 C# 中执行按住 ALT+TAB 发送键事件

    我正在尝试使用按住 ALT 键然后按 TAB 键的 sendkey 事件 你如何执行这个动作 我尝试了很多变体 但我似乎找不到答案 谢谢 在经历了MSDN 文档页面我想出了这个 它似乎对我来说效果很好 SendKeys Send Tab
  • 从 fortran 调用 c++ sub 时运行时中止

    我在这里读过很多关于混合语言使用 Fortran 和 C 的文章 然而 我仍然遇到当前的问题 我的 Fortran 程序总是中止 我有 Fortran 程序 test cc f90 和 C 程序 deb cc cc deb cc cc 包含
  • Jenkins 中的失败管道

    我使用 Jenkins 为我的 Node js 应用程序创建了 CI 管道 我的管道包括构建 单元测试 集成测试 代码分析等作业 我想知道是否有可能使构建失败 例如通过实施像 z 失败的测试数量或通过率 您的单元测试脚本需要处理数学和逻辑
  • 是否有一种可实施(非理论)的方法来证明电子邮件地址是否属于真实的电子邮件帐户?

    有没有办法证明某个电子邮件地址是 真实的 因此属于真正存在的电子邮件帐户 我通过电子邮件获得了大量注册 根据电子邮件模式定义这些注册是有效的 但实际上并不存在 发送到假邮件地址需要花费很多钱 因为我们 和其他人 按每封邮件付费 100 00
  • 如何在 docker-compose 中传递参数?

    Docker 1 9 允许将参数传递给 dockerfile 参见链接 https docs docker com engine reference builder arg 如何在 docker compose yml 中传递相同的参数 如
  • 每个活动底部的通用按钮或选项卡

    我想在每个屏幕 活动的底部放置一些快捷方式或按钮 我知道我们可以通过使用框架布局 相对布局 选项卡小部件等来做到这一点 既然我的每个活动都需要它 我是否需要一次又一次地为每个活动和按钮操作编写 XML 布局 是否可以引用按钮单击等的布局和操
  • 如何更改 NetBeans 中 HAML 标签的颜色?

    我在 NetBeans 6 8 中使用 Aloha 主题 除了 HAML 文件中的这些蓝色标签不可读之外 一切看起来都很酷 如何找到可以改变这种蓝色的地方 附 我使用的 HAML 插件似乎不受支持且缺乏功能 截屏 http img lepr
  • WebGL 深度纹理全白?

    我使用 chrome 中的 WEBGL depth texture 将场景渲染到具有颜色和深度纹理的帧缓冲区 当我显示我的颜色纹理时效果很好 但我的深度纹理是全白色的 不应该是灰色的吗 我的绘制纹理函数 this drawTexture f
  • unix 中的测试命令不打印输出

    为什么命令没有输出test 3 lt 6在unix终端上 测试不应该输出 0 或 1 吗 我做了一个男人测试 它说 退出并以 EXPRESSION 确定的状态退出 退出状态不会打印出来 只是返回 你可以测试一下if or while 例如
  • 时间:2019-03-17 标签:c#castingwithisandas

    我需要一些帮助 这很容易 我有这段代码 我想讨论一下它是否正确 或者您是否建议更好的方法 我对答案有一个想法 但我想看看你的答案 就这样 if myObject is ClassA var myObjectA myObject as Cla
  • LINQ to SQL 执行时间比 SSMS SQL 长 50 倍

    我有一个使用 Linq to SQL 的 asp net 应用程序 应用程序的一项查询超时 执行时间超过 30 秒 我增加了 DataContext 的 CommandTimeout 它确实在 45 秒内完成 我将 Linq to SQL
  • 在 Android Studio 中选择项目模板后不显示语言选项

    Android Studio 中的 新建项目 向导未显示 语言 选项 我想使用 Java 但它迫使我使用 Kotlin 我希望使用 Java 进行 Android 开发 如何制作 Java 项目 您已选择了一个Jetpack 组合项目模板
  • 如何让 java 日志输出显示在一行上?

    目前 默认条目如下所示 Oct 12 2008 9 45 18 AM myClassInfoHere INFO MyLogMessageHere 我怎样才能让它做到这一点 Oct 12 2008 9 45 18 AM myClassInfo
  • 如何让 BaseAdapter 显示 AlertDialog android 应用程序

    如何使 listView 中的 BaseAdapter 中的按钮显示alertDialog 我尝试过 但它意外停止工作 运行时错误 我的代码如下所示 任何建议 提前致谢 莫内拉 更新后 import java util List impor
  • 使用 JSON 数据

    我正在尝试用 C 语言制作一个简单的 twitter 客户端 我对此很陌生 不知道如何从 API 获得的 JSON 字符串中分离出有意义的内容 例如 如果我得到this作为 API 的响应 如何将 text 的值提取到字符串 char 中
  • API网关+Lambda+VPC超时问题

    早上好 您能帮我们解决下一个问题吗 我有一个 API 网关 Java Lambda 处理程序 这个 Lambda 使用 httpconnection 来获取一些互联网 REST API 当我们在没有 VPC 的情况下使用这个 Lambda
  • 如何使用python启动交互式shell程序?

    我已经使用 python subprocess 和 os 模块一段时间了 现在我想从Python 启动一个名为dumbCalculator 的交互式C 程序 这个哑计算器只是读取我的输入并返回其结果 当我输入 1 2 时 它返回 3 如何使
  • 我的 UIScrollView 不适用于 ios6 中的自动布局

    我已将 UIViewController 中的 UIScrollView 放入故事板中 当我使用这段代码时 void viewDidLoad super viewDidLoad scrollview setContentSize CGSiz
  • C 按值传递数组与按引用传递数组

    大家好 我一直在学习 C 我遇到了这个例子 但我并没有真正找到背后的逻辑 这不是关于代码的技术问题 我更多地寻找解释 这是代码 include