什么'&'用C ++表示?

时间:2011-02-09 14:30:45

标签: c++ c

'&'是什么用C ++表示?在函数中

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

}

它在C中的含义是什么?

由于


编辑1

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

11 个答案:

答案 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.htmlWhat 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表示这是对文件名

的引用