【问题标题】:What is the difference between function(int &a){ a = a + 2 } and function(int *a){ *a = *a + 2 }function(int &a){ a = a + 2 } 和 function(int *a){ *a = *a + 2 } 有什么区别
【发布时间】:2021-09-17 05:34:31
【问题描述】:

在 C(不是 C++)中

有什么区别:

function(int &a)
{
    a = a + 2;
}

和:

function(int *a)
{
    *a = *a + 2; 
}

据我了解,它们是一样的吗?

如果有差异,你能举例说明吗?

【问题讨论】:

  • int &a 不是标准的 C 代码。它是 C++。你在学习 C 还是 C++?如果你正在学习C,答案是不要使用int &a;这是无效的。如果您正在学习 C++,有人可能会写一个讨论引用和指针之间差异的答案。选择一种语言,删除另一种语言的标签,然后编辑问题和标题以阐明您所询问的语言。
  • 第二种形式使用指针。第一种形式使用引用,这是一个 C++(不是 C)特性。考虑引用的一种方法是它们是一种受限形式的指针。
  • 在 OP 澄清他们是在询问 C 还是 C++ 之前,不应将其作为重复项关闭。如果他们问的是 C,正如他们所指出的,这不是 C++ 问题的重复。
  • 两者的最终效果是相同的,但参考版本是首选,因为没有人可以意外设置对 null 的引用 function(int *a) { a = NULL ; *a = *a + 2; // 崩溃 }
  • @user3386109:当我们不知道 OP 的意图时,删除 C 标签是不合适的。 OP 可能正在学习 C,但被他们遇到的一些 C++ 代码弄糊涂了,在这种情况下,这是一个 C 问题,应该有一个 C 标签,并且应该回答这不是有效的 C 代码。

标签: c reference dereference


【解决方案1】:

int &a 不是 C 标准定义的代码,一般不能在 C 中使用。在 C++ 中,这声明了对对象的 reference,它类似于指针但不需要 @ 987654323@使用指向的对象时,一旦创建就不能更改,也不能使用空指针。

对于 C++,指针和引用之间的区别在 here 中讨论。在 C 中,您通常不能使用int &a。 (它可以用在一些假设的 C 实现中,支持它作为扩展,这就是 C++ 的起源。)

【讨论】: