C语言是按引用调用吗?

2024-01-11

我知道C语言中没有按引用调用。 但是,有人说C中有Call by Reference。 我很困惑。

据我所知,当将因子交给C中的函数时,我知道传递给函数的值是通过制作本地副本作为参数来接收的。

然而,在C++中,“通过引用调用”是可能的,因为“仅因子和名称不同的相同元素”是通过引用“&”创建的。真的吗?


我知道C语言中没有按引用调用。

正确的。 C 总是按值传递。

有人说C中有一个Call by Reference,我很困惑。

他们错了。这很容易测试。

让我们首先看一下这个小型 Perl 程序。

use 5.014;

sub f {
   $_[0] = 456;   # $_[0] is the first argument.
}

my $x = 123;
f( $x );
say $x;   # 456

改变参数改变了参数。这是按引用传递的示例。 Perl 参数通过引用传递。

现在让我们在 C 中做同样的事情。

#include <stdio.h>

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

int main( void ) {
   int x = 123;
   f( x );
   printf( "%d\n", x );   // 123
}

更改参数对参数没有影响。这是按值传递的示例。 C 的参数是按值传递的。

您可以使用指针来实现类似的结果。

#include <stdio.h>

void f( int *xp ) {
   *xp = 456;
}

int main( void ) {
   int x = 123;
   f( &x );
   printf( "%d\n", x );   // 456
}

请注意,参数(指针)仍然按值传递。改变xp本身(而不是*xp) 对调用者没有影响。

数组也是如此。退化为按值传递的指针。

#include <stdio.h>

void f( char a[] ) {
   a = "def";
}

int main( void ) {
   char a[] = "abc";
   f( a );
   printf( "%s\n", a );   // abc
}

这可以称为传递a参考。它没有通过by不过参考一下。


但是,在 C++ 中,“通过引用调用”是可能的

Correct.

C++ 通常使用按值传递。

#include <iostream>

using namespace std;

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

int main( void ) {
   int x = 123;
   f( x );
   cout << x << endl;   // 123
}

但可以使用以下方式请求通过引用传递&.

#include <iostream>

using namespace std;

void f( int &x ) {
   x = 456;
}

int main( void ) {
   int x = 123;
   f( x );
   cout << x << endl;   // 456
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言是按引用调用吗? 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • std::bind 重载解析

    下面的代码工作正常 include
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include

随机推荐

  • 如何获取WebBrowser控件中的页面标题?

    当我导航到不同的网站时 如何获取 WebBrowser 控件中的页面标题 xmlns xmlns phone clr namespace Microsoft Phone Controls assembly Microsoft Phone 以
  • 为什么Android要求包名至少有两个标识符?

    创建新的 Android 应用程序时 Eclipse http androidcodingtips blogspot com 2011 08 package name must have at least two html抱怨Package
  • 解析附近时 JSON 中位置 XXX 出现意外标记的错误

    I npm install在一个目录上package json对于我的公司项目 然而 它不断给我带来各种错误 Unexpected token in JSON at position 我已经做好了npm cache clean force
  • 在 Bootstrap 3 中启用触摸事件的推荐方法?

    既然 Bootstrap 3 已经发布 那么启用触摸的推荐选项是什么 像之前一样 https stackoverflow com questions 16759299 is twitter bootstrap suitable for to
  • 音频播放完毕后通知

    嗯 我正在尝试实现录音的基本功能 例如 录音 播放 暂停 停止 我可以完成所有这些 但唯一的问题是音频完成后如何收到通知 玩 我的意思是 如果我播放一个音频文件 那么一旦它播放完毕 我想要一个它现在停止的通知 到目前为止我已经用过 mPla
  • 在 Roxygen 中记录时:如何在 @details 中制作逐项列表?

    例如 在 details 部分中向 roxygen2 添加逐项列表的适当语法是什么 我可以创建一个 Latex 列表环境吗 似乎换行符被简单地忽略了 即 details text describing parameter inputs in
  • 错误@angular/fire构建错误地扩展了接口

    我开始新的 Ionic Angular 项目并添加 Angular Fire 包 当我运行 ionicserve 时 出现以下错误 Error node modules angular fire compat firestore inter
  • 忽略全局覆盖的 new/delete

    您好 我正在使用一个已全局覆盖 new delete 的库 但我对这个库有一个问题 问题是它必须在主函数中手动初始化 现在我尝试使用另一个库在调用 main 之前初始化一些函数 不幸的是这个库在这些函数中使用了 new 所以我收到错误 因为
  • 需要建议新的 AsyncTask 递归调用

    我需要建议这个解决方案是否可以接受并且不会导致溢出 我更新使用 AsyncTask 读取的数据 在 AsyncTask 完成后我需要一次又一次更新 该解决方案是否可以接受且安全 private class DownloadFilesTask
  • 如何在sql中转义“'”

    您好 我正在数据库中搜索名称组合 我传递的组合如下 firstName firstName middleName middleName lastName lastName 这很好用 但问题来了 名字里有一些 我该如何纠正呢 例如 Johns
  • MongoDB - 如何对对象内的多个属性进行查询并对结果进行分组

    I m trying学习 MongoDB 但我似乎不知道如何做到这一点 假设我有三个这样的对象 id 99990 type 15 attributes id 1 value 115 id 99991 type 5 attributes
  • Windows 上的 boost python 在 import("__main__") 时崩溃;

    我正在编写一个使用嵌入式 boost python 的程序 我的程序在 Linux Mint 上运行没有问题 但在 Windows 上却很痛苦 我正在使用 MingW 因此我尝试按照本网站上另一个问题的说明创建导入库 考虑到所有这些 程序编
  • 通过 Id (int) 获取视图 Id (string) 的更简单方法

    我的布局中有 24 个按钮 所有这些按钮都执行类似的操作 因此我想创建一个通用功能 但首先我需要知道按钮的名称 xml id 这是按钮的 XML 代码
  • Ada GPS IDE 似乎找不到 GtkAda

    我已经安装了 GNAT 编程工作室 GPS 和 GtkAda 它们似乎都工作正常 但是当我尝试在 从模板新建项目 下构建简单窗口项目时 我收到一堆错误 提示 文件 gtk ads 未找到 这似乎是一个目录 依赖性问题 GPS 不知道在哪里寻
  • UINavigationBar 使用动画更改色调颜色

    是否可以通过动画更改色调以获得更平滑的效果 这对我不起作用 UIView beginAnimations nil context nil self navigationController navigationBar setTintColo
  • Swashbuckle.AspNetCore v1.0.0 与 OAuth2,流程:应用程序 -> IdentityServer4

    我似乎无法让我的 net core Web API 与 swashbuckle OAuth2 和应用程序流程一起工作 当我单击 授权 按钮时 Fiddler 显示调用正常 并且我的本地 IdentityServer 4 回复了 access
  • Theano sqrt 返回 NaN 值

    在我的代码中 我使用 theano 来计算欧几里德距离矩阵 代码来自here https stackoverflow com questions 25886374 pdist for theano tensor import theano
  • 无法在共享驱动器上使用 java 和 smbj 读取文件

    我正在尝试使用 SMBJ jar https github com hierynomus smbj https github com hierynomus smbj 从共享驱动器中获取文件 我能够连接到共享磁盘 连接后 我执行的任何操作都会
  • 如何修改远程Erlang节点的代码搜索路径?

    我已连接到 Erlang 节点 remsh 如何修改代码路径 以加载未打包到我的版本中的库 操作代码加载 路径 的所有必要函数都在代码模块中 请参阅以下位置的文档 Erlang OTP代码模块 http www erlang org doc
  • C语言是按引用调用吗?

    我知道C语言中没有按引用调用 但是 有人说C中有Call by Reference 我很困惑 据我所知 当将因子交给C中的函数时 我知道传递给函数的值是通过制作本地副本作为参数来接收的 然而 在C 中 通过引用调用 是可能的 因为 仅因子和