这是 C 中的按引用调用还是按值调用?

And*_*Lin 3 c kernighan-and-ritchie pass-by-reference call-by-value

我正在读一本由 Brian W. Kernighan 和 Dennis M. Ritchie 撰写的《c 编程语言》一书。

本书列出了下面的代码

void strcpy(char *s, char *t){
    while((*s = *t) != '\0'){
        s++;
        t++;
    }
}
Run Code Online (Sandbox Code Playgroud)

并说:

因为参数是按值传递的,所以 strcpy 可以以任何它喜欢的方式使用参数 st

我不同意这一点。为什么上面的参数是按值传递的?

根据另一本书《C 如何编程》:

在 C 中,您使用指针和间接运算符来模拟引用调用。当调用带有应修改参数的函数时,将传递参数的地址。

从后一个角度来看,它绝对是按引用调用。

请告诉我哪种方法是正确的以及为什么,谢谢!

顺便说一句,赋值后*s = *t,与哪一个进行比较'\0'*s或者*t

lin*_*fan 5

C 总是按值传递参数,这意味着被调用函数接收调用者引用的任何内容的本地副本。

被调用的函数可以修改接收到的值,因为它是本地副本,而不影响原始值。例如:

char *test(char *s) {
  s++;
  return s;
}

t = test("A");
Run Code Online (Sandbox Code Playgroud)

它是合法的,并且表明可以修改参数 s 而不会影响调用者(传递一个文字......)。

但是你的例子中的 strcpy() 做了一些不同的事情:它接受一个指针 s ,并修改 s 指向的内容。指针的功能很强大,可以用来模拟“按引用传递”(指针就是引用)。

赋值*s = *t 后,哪一个与'\0' 进行比较?*种类?

*s:在 C 中,赋值返回一个值 - 该值是赋值完成后所分配变量的值。写作:

if (i=3) ...
Run Code Online (Sandbox Code Playgroud)

是相同的

i=3;
if (i) ...
Run Code Online (Sandbox Code Playgroud)

如果 i 是一个指针,语法会有所不同,但机制是相同的,赋值将“使用”指针,并且整个赋值的值用作测试中要评估的表达式。