我有一份带有许多问题的家庭作业。一个是问为什么strcpy()函数不需要CStrings的引用操作符调用。我已经多次浏览了这本书,但在我的生活中,我找不到答案。任何人都可以帮我解释一下吗?
这是一系列排序,所以我认为您需要通过引用进行调用。
答案 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()
变量。只有一个变量:x
和y
指定相同的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)
自动类型转换,是我猜他们正在寻找的答案。看起来可能会给你一些帮助。