gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:06:26 24 4
gpt4 key购买 nike

我正在阅读由 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 parameterss and t in any way it pleases

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

根据另一本书C how to program:

In C, you use pointers and the indirection operator to simulatecall-by reference. When calling a function with arguments that shouldbe 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com