c - 这个调用在 C 中是通过引用调用还是通过值调用?

标签 c pass-by-reference kernighan-and-ritchie call-by-value

我正在阅读由 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/

相关文章:

android - 如何在C for Android中正确连接蓝牙服务器?

c - 为什么在 XWindows 中绘图很重要?

f# - 如何在 F# 中调用 bool.TryParse

c - K&R - getop() 函数

c - 为什么 "The C Programming Language"书说我必须转换 malloc?

c - 函数声明与原型(prototype)的替代 (K&R) C 语法

c - 将 IP 地址从 int 更改为 string 的问题

c# - 改进/修复 C 样式 block 注释的正则表达式

c# - 传递对象的字段而不是整个对象本身是否小于 'expensive'?

ios - Swift 将对象的属性设置为 nil