我正在阅读由 Brian W. Kernighan 和 Dennis M. Ritchie 合着的c 编程语言一书。
本书列出了下面的代码
void strcpy(char *s, char *t){
while((*s = *t) != '\0'){
s++;
t++;
}
}
并说:
Because arguments are passed by value, strcpy can use the parameters s and t in any way it pleases
我不同意。为什么上面的参数是按值传递的?
根据另一本书C how to program:
In C, you use pointers and the indirection operator to simulate call-by reference. When calling a function with arguments that should be modified, the addresses of the arguments are passed.
从后一种观点来看,肯定是call-by-reference。
请告诉我哪种方式是正确的,为什么,谢谢!
顺便说一句,赋值*s = *t
后,哪个与'\0'
比较? *s
还是 *t
?
最佳答案
C 始终按值传递参数,这意味着被调用函数接收调用者引用的任何内容的本地副本。
被调用的函数可以修改接收到的值,因为它是本地副本,不会影响原始值。例如:
char *test(char *s) {
s++;
return s;
}
t = test("A");
这是合法的,表明可以修改参数 s 而不会影响调用者(它传递的是文字...)。
但是您示例中的 strcpy() 做了一些不同的事情:它接受一个指针 s,并且修改 s 指向的内容。指针功能强大,可用于模拟“按引用传递”(指针是引用)。
after assignment *s = *t is held, which one is compared with '\0'? *s or *t?
*s:在 C 语言中,赋值返回一个值——该值是赋值完成后赋值变量的值。写作:
if (i=3) ...
与
相同i=3;
if (i) ...
如果 i 是一个指针,语法会有所不同,但机制是相同的,赋值将“使用”指针,并且整个赋值的值用作要在测试中评估的表达式。
关于c - 这个调用在 C 中是通过引用调用还是通过值调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51054056/