将变量传递给带有 & 的函数

passing variable to function with & in the header

本文关键字:函数 变量      更新时间:2023-10-16

我正在做一个过程,它正在工作,但我不确定它是否在所有情况下都能工作,因为它不是传统的。

void func (int &num){
    num=blah;
}
int main() {
    int num;
    func(num);
}

我知道这样做的传统方式如下,但我仍然有很多以前格式的代码,我不想更改,因为它工作得很好。我不明白的是我是否只是运气好。

void func (int* num){
    *num=blah;
}
int main() {
    int num;
    func(&num);
}

事实上,还有一个更复杂的版本:

void func(float* &list){
    list=new float[3];
}
int main() {
    float *list;
    func(list);
}

我再次理解传统的方法如下。

void func(float** list){
    *list=new float[3];
}
int main(){
    float *list;
    func(&list);
}

非常感谢你的帮助,因为我完全不知所措。

您的第一个示例是正确的-您通过引用func()传递int

你的第二个例子也很好(现在你已经编辑好了)。在这种情况下,通过值将int *传递给func()

你的第三个和第四个例子也是正确的。在第三个例子中,您通过引用传递一个float *。在第二种情况下,您通过值传递float **(这在语义上类似于通过引用传递float *,这可能是您混淆它们的原因)。

您的任何示例代码都没有任何"常规"或"非常规"之处。所有这些都是100%正确的,并且会很好地工作。尽管按值传递指针和按引用传递指针之间存在一些细微的语义差异,但这些示例是可以的

int &的语法不是C,而是C++。这就是所谓的参考。如果你的C(而不是C++)编译器接受is,那么它是一个非标准扩展(当然,对于C++编译器来说,它是语言的一部分)。

引用的基本机制是,它充当现有对象的名称(或另一个名称)。例如:

int a;
int& b = a;
b = 3; /* equivalent to a = 3 */

考虑引用的一种方式是将其视为自动取消引用的指针(这也是它通常的实现方式)。也就是说,上述代码相当于

int a;
int* pb = &a;
*pb = 3;

表单Func(int &x)是传递引用c的c++形式,不支持此功能。从逻辑上讲,传递指针是模棱两可的。通讯员在电话中隐式地为你取地址。

在C中,您将始终声明

Func(int *x)
{ ... } 

并称之为

Func(&SomeInt);