3

我有一个家庭作业,有很多问题。一个是问为什么 strcpy() 函数不需要 CStrings 的引用运算符调用。这本书我翻阅了无数遍,终生无法找到答案。谁能帮我解释一下?

这是一个各种各样的数组,所以我认为您需要通过引用进行调用。

4

7 回答 7

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 位。

于 2010-05-11T12:51:36.760 回答
2

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

为什么会这样编译?

CString sExample;
char buffer[LARGE_ENOUGH];

strcpy(buffer, sExample);

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

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

于 2010-05-11T12:56:10.927 回答
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()f()它的x作用不会影响yofg()包含的内容。然后变量按值传递。

C++ 有一个引用的概念,它是这样的:

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

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

在这里,特殊构造(带有“ &”)指示 C++ 编译器玩一些隐藏的技巧,因此xknown byf()实际上是对yby 使用的变量的一种别名g()。只有一个变量:xy指定相同的 RAM 块。变量在这里通过引用传递。

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

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

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

  • C++ 语法含义:“引用”用&我上面描述的“”表示特殊构造。

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

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

于 2010-05-11T13:11:25.147 回答
1

好吧,在您的意思是 c-strings (char*) 的情况下,您不需要通过引用进行调用,因为字符串本身就是一个指针。所以字符串复制知道从哪里复制字符串。

于 2010-05-11T12:51:28.690 回答
0

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

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

于 2010-05-11T12:51:55.433 回答
0

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

请参阅 Peter Van Der Linden 专家 C 编程,Deep Secrets 书。

于 2010-05-11T12:52:14.203 回答
0

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

于 2011-09-27T21:57:19.640 回答