“&”在C ++中意味着什么?

“&”在C ++中意味着什么? 在function范围内

void Read_wav::read_wav(const string &filename) { } 

它在C中的等价物是什么?

谢谢


编辑1

如果我想将上面的C ++函数转换为C函数,我该怎么做?

在该上下文中,&使变量成为引用。

通常,当您将变量传递给函数时,将复制该变量,并且该函数将在该副本上运行。 函数返回时,原始变量不变。 传递引用时,即使在函数返回后,也不会复制该函数所做的更改。

C没有引用,但C ++引用在function上与C中的指针相同。真正唯一的区别是指针在使用时必须取消引用:

  *filename = "file.wav"; 

但是可以使用引用,就像它们是原始变量一样:

  filename = "file.wav"; 

表面上看,引用应该永远不会为空,尽管它不可​​能发生。

等效的C函数是:

  void read_wav(const char* filename) { } 

这是因为C没有string 。 C中的常用做法是在需要字符串时发送指向字符数组的指针。 与在C ++中一样,如果键入字符串常量

  read_wav("file.wav"); 

类型是const char*

这意味着变量是一个参考 。 在C中没有直接的等价物。您可以将其视为在使用时自动解除引用的指针,并且可能永远不会为NULL。

在C中表示字符串的典型方法是使用char指针,因此该函数可能如下所示:

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

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

&符号在C ++中以两种不同的含义使用:获取某个地址(例如变量或函数)的地址,并指定变量或函数参数作为对其他地方定义的实体的引用。 在您的示例中,后一个含义正在使用中。

C严格来说没有像引用这样的东西,但指针(或指针指针)已经成为类似事物的用户。

参见例如http://www.cprogramming.com/tutorial/references.html,C ++中指针变量和引用变量之间有什么区别? 或者http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29 ,以获取有关C ++中引用的更多信息。

在C中,你会这样写:

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

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

&是一个C ++参考。 它的行为就像你处理后面的指针一样(它主要是一个语法糖,认为它提示合同后面的指针不应为null)。

在这种特殊情况下,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()); } 

do_read_wav是你的C例程,internal_read_wav是指向C风格结构的指针。

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

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

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

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

有一个C库来模拟std::string (也就是说,提供一个封装的接口),称为bstring for Better String Library 。 它使您免于必须处理两个不同变量(数组和长度)的单调乏味。

您不能在C使用类,但您可以使用转发的struct(以强加封装)来模拟它们,而类方法只是使用显式参数成为常规函数。

总而言之,这导致了以下转变:

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

哪个(除了struct噪声)与之前的相似:)

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

你可能想查看Binky Pointer的乐趣 ,它是一个video,说明指针和参考是什么。

在这种情况下, string &filename表示函数将接收引用(内存地址)作为参数,而不是将其作为副本接收。

此方法的优点是您的函数不会在堆栈上分配更多空间来保存filename中包含的数据。

正如其他人所说,这是一个参考。 在C中,您可能会将函数编写为类似的函数

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

&filename表示这是对filename的引用