C++中的'&'符号是什么意思?

7
在C++中,“&”代表取地址符。在函数内部,它可以用于获取变量的地址,以便对其进行操作。
void Read_wav::read_wav(const string &filename)
{

}

那它在C语言中的相对应是什么?

如果我想将上述的C++函数转换成C函数,我该怎么做呢?


1
http://en.wikipedia.org/wiki/Reference_(C%2B%2B) - Tim M.
1
正如@Tim Medora所说的那样http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29(但我已经更正了链接;) - Hernán Eche
@Hernán Eche - 我粘贴失败了...谢谢! - Tim M.
4
如果我想将上述的C++函数转换成C函数,我该怎么做?1.停止使用类。2.停止使用字符串。3.停止使用按引用传递。 - David Heffernan
虽然这些答案适用于这种情况,但请记住,在C++中,&符号也可能表示其他含义。参考链接 - quant
11个回答

12

这意味着变量是一个引用。在C语言中没有直接的等价物。你可以把它看作是一个指针,在使用时自动取消引用,而且永远不可能为NULL(也许)。

C语言中表示字符串的典型方法是通过char指针,因此函数可能看起来像这样:

void read_wav(struct Read_wav* instance, const char *filename)
{
}

注意:这里的第一个参数模拟了你在 C++ 中会拥有的隐式 this 对象引用,因为这看起来像是成员方法。


1
你需要一个对原始结构体的引用 -- 根据使用情况,Read_wav类的内部正在被使用。 - Foo Bah
虽然不太可能,但 std::string const& filename 可能包含嵌入的空字符,为了完美地模拟 std::string,您需要提供一个显式的 length 参数。或者,像我一样,选择使用 bstring 库。 - Matthieu M.

12
在这种情况下,&会将变量变成引用。
通常情况下,当你将一个变量传递给函数时,该变量被复制并且函数在副本上运行。当函数返回时,原始变量保持不变。当你传递一个引用时,不会进行复制,函数所做的更改即使在函数返回后也会显示出来。
C语言没有引用,但是C++中的引用在功能上与C指针相同。真正的区别仅在于使用指针时必须对其进行解引用:
    *filename = "file.wav";

但是引用可以像原始变量一样使用:

    filename = "file.wav";

引用(reference)表面上是不应该为null,虽然这种情况发生的可能性很低。

相当于C函数是:

     void read_wav(const char* filename)
     {

     }

这是因为C语言没有string类型。在C中通常的做法是当你需要一个字符串时发送一个指向字符数组的指针。就像在C++中,如果你输入一个字符串常量:

    read_wav("file.wav");

该类型是const char*


表面上,引用应该永远不会为空,尽管这种情况并非不可能发生。如果在调试过程中发现了空引用,则程序很可能已经出现了内存损坏,这是未定义行为。 - Acorn

1
在 C 语言中,你会这样写:
void read_wav(struct Read_wav* , const char * pSzFileName)
{

}

std::string是C++处理const char数组的方式。

&是C++中的引用。它的行为就像你在处理指针一样(它主要是一种语法糖,但它提示了指针后面不应该为空的约定)。


2
只有当它是“静态的”时,你才会以那种方式编写。非静态成员函数需要显式的Read_wav*参数来替换C++中的隐式this - dan04

1
在这种情况下,std::string有一个c_str方法,它返回一个const char *。您可以创建一个并行的C版本,然后让您的C++执行类似以下操作:
void Read_wav::read_wav(const string &filename)
{
    do_read_wav(internal_read_wav, filename.c_str());
}

where do_read_wav is your C routine and internal_read_wav is a pointer to a C-style struct.

其中,do_read_wav是您的C例程,internal_read_wav是指向C风格结构体的指针。

void do_read_wav(struct Read_wav rw, const char * filename)

现在,如果您要在类中存储信息,您需要创建一个C结构体[所有字段必须是POD等]。

1

引用是别名,它们与指针非常相似。

std::string 是一个带有显式 lengthchar 数组(也就是说,其中可以嵌入空字符)。

有一个 C 库来模拟 std::string(即提供封装接口),称为 Better String Librarybstring。它使你免于处理两个不同变量(数组和长度)的繁琐工作。

你不能在 C 中使用类,但你可以用转发的结构体来模拟它们(以强制封装),而类方法只需成为具有显式参数的常规函数。

总之,这导致以下转换:

void Read_wav::read_wav(const string &filename);

void read_wav(struct Read_wav* this, struct bstring const* filename);

除了 struct 的噪音之外,这与你以前的代码非常相似 :)


1

在C++中,&符号有两个不同的用途:获取某个东西的地址(例如变量或函数)和指定变量或函数参数为对某个定义在别处的实体的引用。在您的示例中,采用了后一种含义。

C语言严格来说没有引用这样的东西,但是指针(或指向指针的指针)已经被用于类似的事情很长时间了。

有关C++中引用的更多信息,请参见http://www.cprogramming.com/tutorial/references.html指针变量与引用变量之间的区别是什么?http://en.wikipedia.org/wiki/Reference_(C++)


0

如其他人所说,这是一个引用。 在C语言中,你可能会将函数写成以下形式:

void read_wav(struct Read_wav* rw, const char* filename)
{

}

1
@Foo Bah:甚至可以是const char * const filename :) - GrahamS

0

& 表示变量通过引用传递。因此,在函数内部,您将不会有变量的本地副本,而是原始变量本身。在函数内对变量所做的所有更改都会影响传递的原始变量。


没错,但在这种情况下由于有const限定符,变量将不会被改变。 - Nikko

0
你可能想看看Binky Pointer fun,这是一个视频,可以说明指针和引用是什么。

0
在这种情况下,string &filename 表示函数将接收一个引用(内存地址)作为参数,而不是作为副本接收。
这种方法的优点是,您的函数不会在堆栈上分配更多空间来保存 filename 中包含的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接