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 可以以任何它喜欢的方式使用参数 s和t
我不同意这一点。为什么上面的参数是按值传递的?
根据另一本书《C 如何编程》:
在 C 中,您使用指针和间接运算符来模拟引用调用。当调用带有应修改参数的函数时,将传递参数的地址。
从后一个角度来看,它绝对是按引用调用。
请告诉我哪种方法是正确的以及为什么,谢谢!
顺便说一句,赋值后*s = *t,与哪一个进行比较'\0'?*s或者*t?
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 是一个指针,语法会有所不同,但机制是相同的,赋值将“使用”指针,并且整个赋值的值用作测试中要评估的表达式。