'&'是什么用C ++表示?在函数中
void Read_wav::read_wav(const string &filename)
{
}
它在C中的含义是什么?
由于
编辑1
如果我想将上述C ++函数转换为C函数,我该怎么做?
答案 0 :(得分:12)
这意味着变量是reference。在C中没有直接的等价物。您可以将其视为在使用时自动解除引用的指针,并且可能永远不会为NULL。
在C中表示字符串的典型方法是使用char
指针,因此函数可能如下所示:
void read_wav(struct Read_wav* instance, const char *filename)
{
}
注意:这里的第一个参数模拟了C ++中的隐式this
对象引用,因为它看起来像一个成员方法。
答案 1 :(得分:12)
在这种背景下,&使变量成为参考。
通常,当您将变量传递给函数时,将复制该变量,并且该函数将在该副本上运行。函数返回时,原始变量不变。传递引用时,即使在函数返回后,也不会复制该函数所做的更改。
C没有引用,但C ++引用在功能上与C中的指针相同。真正唯一的区别是指针在使用时必须取消引用:
*filename = "file.wav";
但可以使用引用,就像它们是原始变量一样:
filename = "file.wav";
表面上看,引用应该永远不会为空,尽管这不可能发生。
等效的C函数是:
void read_wav(const char* filename)
{
}
这是因为C没有string
。 C中的常规做法是在需要字符串时发送指向字符数组的指针。与在C ++中一样,如果键入字符串常量
read_wav("file.wav");
类型为const char*
。
答案 2 :(得分:1)
在C中,你会这样写:
void read_wav(struct Read_wav* , const char * pSzFileName)
{
}
std :: string是处理const char数组的C ++方法。
&安培;是一个C ++参考。它的行为就像你处理后面的指针一样(它主要是一个语法糖,认为它提示合同后面的指针不应为空)。
答案 3 :(得分:1)
&符号在C ++中以两种不同的含义使用:获取某个地址(例如变量或函数)的地址,并指定变量或函数参数作为对其他地方定义的实体的引用。在您的示例中,后一个含义正在使用中。
C严格来说没有像引用这样的东西,但指针(或指针指针)已经成为类似事物的用户。
参见例如有关C ++中引用的详细信息,请http://www.cprogramming.com/tutorial/references.html,What are the differences between a pointer variable and a reference variable in C++?或http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29。
答案 4 :(得分: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());
}
其中do_read_wav是你的C例程,而internal_read_wav是指向C风格结构的指针。
void do_read_wav(struct Read_wav rw, const char * filename)
现在,如果要在类中存储信息,则需要创建一个C结构[所有字段必须是POD等]
答案 5 :(得分:1)
引用是别名,它们与指针非常相似。
std::string
是一个char
数组,带有显式length
(也就是说,可以嵌入空字符)。
有一个C库可以为Better String Library模拟std::string
(即提供封装的接口)bstring
。它使您免于必须处理两个不同的变量(数组和长度)的乏味。
你不能在C
中使用类,但你可以使用转发的struct(强制封装)来模拟它们,而类方法只是变成带有显式参数的常规函数。
总而言之,这导致了以下转变:
void Read_wav::read_wav(const string &filename);
void read_wav(struct Read_wav* this, struct bstring const* filename);
除了struct
噪音之外)与之前的情况非常相似:)
答案 6 :(得分:0)
&安培;表示变量通过引用传递。因此,在函数内部,您将没有变量的本地副本,而是原始变量本身。函数内部变量的所有更改都将影响原始传递的变量。
答案 7 :(得分:0)
您可能需要查看Binky Pointer fun,这是一个说明指针和参考资料的视频。
答案 8 :(得分:0)
在这种情况下,string &filename
表示函数将接收引用(内存地址)作为参数,而不是将其作为副本接收。
此方法的优点是您的函数不会在堆栈上分配更多空间来保存 filename 中包含的数据。
答案 9 :(得分:0)
正如其他人所说,这是一个参考。 在C中,您可能会将函数编写为类似
的函数void read_wav(struct Read_wav* rw, const char* filename)
{
}
答案 10 :(得分:-3)
& filename表示这是对文件名
的引用