指针是否被视为 C 中通过引用调用的方法?

2024-01-16

在我大学的 C 编程课上,教授和她随后写的书使用了这个术语调用或通过引用传递当提到pointers in C.

我的教授认为“通过引用调用函数”的示例:

int sum(int *a, int *b);

我的教授认为“按值调用函数”的一个示例:

int sum(int a, int b);

I've read https://stackoverflow.com/questions/1919718/pass-by-reference-in-cC 不支持引用调用。据我了解,指针按值传递.

基本上是这样的不正确说指针是 C 的引用传递方式?可不可能是更正确是说你不能在 C 中通过引用传递,但可以使用指针作为替代?


2015 年 11 月 11 日更新

从我的问题提出的方式来看,我相信术语的争论已经开始,事实上我看到了两个具体的区别。

  • 引用传递(当今主要使用的术语):specificC++ 等语言中使用的术语
  • 引用传递(我的教授使用这个术语作为解释指针的范例):general在 C++ 等语言开发之前使用的术语,因此在该术语被重写之前

阅读@Haris的更新答案后,就明白为什么这不是那么黑白分明了。


在 C 中不能通过引用传递,但可以使用指针作为替代

是的,没错。


详细说明一下。无论您将什么作为参数传递给 c 函数,它都仅通过值传递。无论是变量的值还是变量的地址。

区别在于您发送的内容。

当我们按值传递时,我们将变量的值传递给函数。当我们按引用传递时,我们将变量的别名传递给函数。 C 可以将指针传递给函数,但这仍然是按值传递。它将指针的值(地址)复制到函数中。


  • 如果您发送变量的值,则函数只会接收该值,并且更改该值不会影响原始值。

  • 如果您发送变量的地址,则也仅发送值(在本例中为地址),但由于您拥有变量的地址,因此可以使用它来更改原始值。


作为一个例子,我们可以看一些 C++ 代码来理解按值调用和按引用调用之间的真正区别。取自this http://programmingknowledgeblog.blogspot.in/2013/04/c-example-for-pass-by-reference.html网站。

// Program to sort two numbers using call by reference. 
// Smallest number is output first.

#include <iostream>
using namespace std;

// Function prototype for call by reference
void swap(float &x, float &y);

int main()
{
   float a, b;

   cout << "Enter 2 numbers: " << endl;
   cin >> a >> b;
   if(a>b) 
     swap(a,b); // This looks just like a call-by-value, but in fact
                // it's a call by reference (because of the "&" in the
                // function prototype

   // Variable a contains value of smallest number
   cout << "Sorted numbers: ";
   cout << a << " " << b << endl;
   return 0;
}

// A function definition for call by reference
// The variables x and y will have their values changed.

void swap(float &x, float &y)
// Swaps x and y data of calling function
{
   float temp;

   temp = x;
   x = y;
   y = temp;
}

在这个 C++ 示例中,参考变量(C 中不存在)正在被使用。去引用this http://www.ntu.edu.sg/home/ehchua/programming/cpp/cp4_PointerReference.html网站,

“引用是别名,或者现有变量的替代名称......”,

and

“引用的主要用途是充当函数形式参数来支持引用传递......”

这与使用指针作为函数参数不同,因为,

“指针变量(或简称指针)与其他变量基本相同,都可以存储一段数据。与普通变量存储值(如 int、double、char)不同,指针存储的是值。一个内存地址。”

因此,本质上,当发送地址并通过指针接收时,仅发送值,但当发送/接收引用变量时,则发送别名或引用。


**UPDATE : 11 November, 2015**

业内曾有过长期争论C 聊天室 https://chat.stackoverflow.com/rooms/54304/c,在阅读了这个问题的评论和答案后,我意识到可以用另一种方式来看待这个问题,即另一种观点。

让我们看一些简单的 C 代码

int i;
int *p = &i;
*p = 123;

在这种情况下,人们可以使用这样的术语:p 的值是对 i 的引用。所以,如果是这种情况,那么如果我们发送相同的指针(int* p)对于一个函数,人们可以说,因为i的引用被发送到该函数,因此可以调用它引用传递.

因此,这是术语和看待场景的方式问题。

我不会完全不同意这个论点。但对于一个完全遵守书本和规则的人来说,这是错误的。


NOTE:更新灵感来自this https://chat.stackoverflow.com/transcript/message/26783261#26783261 chat.

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

指针是否被视为 C 中通过引用调用的方法? 的相关文章

随机推荐

  • .STACK 未在 MASM 中分配正确的大小

    基于微软MASM文档 https learn microsoft com en us cpp assembler masm dot stack view vs 2019 STACK指令的用法是 与 MODEL 一起使用时 定义堆栈段 段名称
  • jQuery 显示带有 More 和 Less 链接的第一个 X 元素

    我试图找到一个 jQuery 解决方案 在左侧导航过滤器中显示每个菜单上的前 3 个项目 并带有 显示更多 和 显示更少 链接 使用户能够扩展列表 我已经寻找了一个解决方案 但大多数展开 折叠脚本完全隐藏图层 而其他脚本则显示展开 显示更多
  • Android 应用程序仅在发布 APK 时崩溃

    我有一个好奇的问题 我构建了一个在调试模式下运行良好的应用程序 直接调试我的手机并在手机上安装了调试 APK 但如果我使用发布构建 APK 该应用程序会在某一时刻崩溃 我发现应用程序在发布 APK 时崩溃 但我不知道为什么以及我能做什么 p
  • Passenger Standalone 在触摸 restart.txt 时不会重新启动

    我构建了一个小部署脚本 其工作方式与 Capistrano 类似 它将 Rails 应用程序检出到带时间戳的目录并设置current当一切顺利时链接到该链接 问题是 在触摸 tmp restart txt 时 什么也没有发生 我想知道这是否
  • 匹配两个列表之间的相似元素

    我是 python 新手 所以如果这是一个愚蠢的问题 我深表歉意 我有两个清单 L1 marvel audi mercedez honda and L2 marvel comics bmw mercedez benz audi 我想提取其中
  • 在 Windows 上安装 pyspark

    我可以做一个pip install pyspark在我的窗户上 当我尝试运行下面的示例脚本时 它告诉我我的SPARK HOME未设置 我还需要设置 SPARK HOME 吗 我该怎么做 我在网上提到的博客从 Spark 网站手动提取 Spa
  • 如何禁用 kubernetes 中 2 个不同命名空间中的 pod 之间的交叉通信

    我有 2 个命名空间和 1 个 Pod 每个命名空间中运行 1 个服务 Example Namespace 1 default Pod pod1 Service pod1service Namespace 2 test Pod pod1 S
  • 将时间戳与续集查询中的日期进行比较

    I have createdAt将值存储为的列 2018 11 07 15 03 16 532 00 我想写这样的查询select from table name where createdAt input date 我的input dat
  • 如何在柱形图中隐藏零值

    我正在使用柱形图并将这些值显示在每个条形的顶部 如果值为 0 我不想显示这些值 该怎么做 这是我的代码 var series data dataLabels enabled true color black align right x 3
  • 随机状态代码:连接到 lambda 的 AWS api 网关出现 502 错误

    我使用代理集成通过 api 网关公开了多个 lambda 有时我会收到状态代码 502 的奇怪错误 lambda 云监视日志中没有任何内容 下面我发布了示例请求的 API 网关日志 0cbbd9f5 f1bd 11e7 92c0 4d5d3
  • Android Studio模拟器参数

    Android studio 使用这样的命令行启动模拟器 Users sergey Library Android sdk tools emulator avd Nexus 5 API 22 x86 netspeed full netdel
  • GUI 屏幕转换在 qml 中如何工作

    我是一名 C 开发人员 现在正在研究在 QtQuick 中使用 QML 进行 GUI 开发 在 GUI 创建过程中 用户只能看到一个屏幕 并根据用户交互来切换屏幕 但背后究竟发生了什么 有很多信息仅涉及如何设计单个屏幕 但有关如何管理其状态
  • 设置 1000 到 10.00 之间数字的格式

    我想将 1000 格式化为 10 00 PHP number format 函数似乎对此不起作用 我努力了 amount2 number format cost 2 echo cost 有任何想法吗 有没有办法可以操作 number for
  • C# 垃圾收集器交叉引用

    垃圾收集器是否会为交叉引用的对象 类释放资源 该对象 类不再从主程序中引用 例如 class class1 class2 m RefClass2 class class2 class1 m RefClass1 class class3 pu
  • 如何用Python实现看门狗定时器?

    我想用 Python 实现一个简单的看门狗定时器 有两个用例 看门狗确保函数的执行时间不会超过x seconds 看门狗确保某些定期执行的函数确实至少执行y seconds 我怎么做 只是发布我自己的解决方案 from threading
  • 从另一台机器访问 Mac OS X 上的 Jenkins

    我想从路由器和互联网后面到达詹金斯 非常简单的设置 互联网 gt 路由器 gt Mac gt Jenkins 已知项目 从路由器上 我可以看到机器的内部 IP 我将其称为 X X X X 然后是Jenkins中的Jenkins URL位置配
  • 无法删除对象“dbo.Table1”,因为它由 FOREIGN KEY 约束引用

    即使我正在删除并尝试删除表 我也会收到错误 ALTER TABLE dbo Table1 DROP CONSTRAINT FK Table1 Table2 GO DROP TABLE dbo Table1 GO Error 消息 3726
  • C# 小数舍入不一致吗?

    我一直在与来自 SQL Decimal 38 30 的 C 中的小数精度作斗争 最终我终于将其实现了四舍五入的奇怪效果 我知道我可能忽略了这里显而易见的事情 但我需要一点洞察力 我遇到的问题是 C 无法产生我认为一致的输出 decimal
  • C和C++中return 0有什么意义? [复制]

    这个问题在这里已经有答案了 我需要最简单的答案 我在各个网站上查找了答案 如果程序的输入导致输出为 10 则命令 return 0 是否会强制程序返回值 0 而不是 10 我在 Borland IDE 上编写了简单的 C 程序 没有返回 0
  • 指针是否被视为 C 中通过引用调用的方法?

    在我大学的 C 编程课上 教授和她随后写的书使用了这个术语调用或通过引用传递当提到pointers in C 我的教授认为 通过引用调用函数 的示例 int sum int a int b 我的教授认为 按值调用函数 的一个示例 int s