C ++为什么strcpy()不需要引用调用

时间:2010-05-11 12:48:30

标签: c++ strcpy

我有一份带有许多问题的家庭作业。一个是问为什么strcpy()函数不需要CStrings的引用操作符调用。我已经多次浏览了这本书,但在我的生活中,我找不到答案。任何人都可以帮我解释一下吗?

这是一系列排序,所以我认为您需要通过引用进行调用。

7 个答案:

答案 0 :(得分:3)

strcpy()指针带到 char

因此,您不会将“字符串”作为参数传递,而只传递其第一个字符的地址。

所以基本上你有这样的东西:

void func(const char* str);

const char* str = "abc";
func(str); // Here str isn't passed by reference but since str is a pointer to the first character ('a' here), you don't need a reference.

传递指针很快。在32位架构上,无论指向字符串的长度如何,指针都需要32位。

答案 1 :(得分:2)

如果您的意思是class CString,那么换句话说问题是:

为什么要编译?

CString sExample;
char buffer[LARGE_ENOUGH];

strcpy(buffer, sExample);

答案是,因为class CString定义了一个运算符const char *,因此可以转换为strcpy的第二个参数类型。

我不确定这是不是你的意思。

答案 2 :(得分:2)

这主要是术语问题。

当被调用函数获取块的副本时,“对象”(我使用术语“设计”一块RAM“)由传递。当被调用函数获取访问唯一块的方法时,它由引用传递。

考虑一下:

void f(int x)
{
    x = 42;
}

void g()
{
    int y = 54;
    f(y);
    // here "y" still has value 54
}

此处,函数f()修改x,但这是它自己的x,这是一个变量,其中包含y g()变量内容的副本1}}。 f()对其x执行的操作不会影响y g()所包含的内容。然后通过值传递变量。

C ++有一个参考概念,如下所示:

void f(int& x)
{
    x = 42;
}

void g()
{
    int y = 54;
    f(y);
    // here "y" now has value 42
}

这里,特殊构造(带有“&”)指示C ++编译器播放一些隐藏的技巧,以便x已知的f()实际上是一种别名y使用的g()变量。只有一个变量:xy指定相同的RAM块。这里的变量通过引用传递。

现在,考虑一个“C字符串”。在C(和C ++)中,字符串只是一堆char值,其中最后一个值为0(这是传统的字符串终止符)。代码不直接处理字符串;它使用指针。指针是实际指定RAM中的放置的值。指针不是字符串;指针是一种数字(通常是32或64位,它取决于处理器类型和操作系统),它告诉RAM中的哪一个是字符串的第一个char。所以当你调用strcpy()时,你实际上给它指针(一个用于目标缓冲区,一个用于源字符串)。这些指针是未修改的:源字符串和目标缓冲区不会在进程中移动;只将字符串的 contents 复制到目标缓冲区中。

因此,strcpy()无需访问包含调用者代码中指针的变量。 strcpy()只需要知道目标缓冲区和源字符串在RAM中的位置。将指针值的副本提供给strcpy()就足够了。因此,这些指针按值传递。

请注意,在存在指针的情况下,需要考虑两个对象:包含指针的变量以及指向的RAM块。指针本身由值传递(strcpy()接收自己的变量副本,该变量包含指向目标缓冲区的指针)。我们可以说RAM的指向块(目标缓冲区)是“通过引用传递的”,因为它在进程中没有重复,被调用的函数(strcpy())可以修改它。这里的要点是术语“参考”具有两个不同的含义:

  • C ++语法含义:“reference”使用我上面描述的“&”指定特殊构造。

  • 语言理论的形式意义:“引用”指定一种间接指定值的方式,以便调用者和被调用者可以以不同的名称访问相同的RAM块。有了这个意思,通过值传递 指向被调用函数的指针等同于通过引用传递 指针所指向的RAM块。

C ++“reference”(第一个含义)是一种将“通过引用”(第二个含义)传递给变量的语法方式。

答案 3 :(得分:1)

那么你的意思是c-strings(char *)你不需要通过引用调用,因为字符串本身就是一个指针。所以字符串副本知道从哪里复制字符串。

答案 4 :(得分:0)

因为strcpy适用于作为指针的char *。指针按值传递,strcpy使用该指针访问目标字符串中的单个字符并更改它们。将其与按值传递整数进行比较 - 该函数不能更改原始整数。

了解char *字符串与整数之间的关系对于在C ++课程中不要发疯是至关重要的。为你的教授做得好,让你面对它。

答案 5 :(得分:0)

因为在C中调用函数时,数组作为第一个元素的地址传递,这相当于通过引用调用。

参见Peter Van Der Linden专家C编程,Deep secretts book。

答案 6 :(得分:0)

自动类型转换,是我猜他们正在寻找的答案。看起来可能会给你一些帮助。