什么是值语义和引用语义以及它们的区别?

11
什么是值语义和引用语义,它们之间有什么区别?您能否用C语言的示例向我展示?
我猜在引用语义中,只需将指针发送到另一个函数,那么这就是引用语义?我很难理解什么是值语义?如果我只使用int作为参数,然后让该函数返回int,那么该函数使用值语义吗?副作用如何影响此操作?如果我对此正确,那么必须有其他值语义的示例。您能否给我一些例子呢? 如果一个函数以指针作为参数,而函数的返回值是一个int,则该函数同时使用引用语义和值语义吗?

或许你会对将int按引用传递和按值传递有什么好处感兴趣。 - M.M
2
值语义意味着您访问副本,而引用语义意味着您访问实际内容。最接近引用语义的是将数组传递给函数或传递指针。 - Sergey Kalinichenko
这个回答解决了你的问题吗?“值语义”和“指针语义”是什么意思? - Karl Knechtel
1个回答

9
在引用语义中,参数指的是原始对象,无论是读取还是写入。
在值语义中,参数只是对象的值,即副本而非原件。当然,如果你通过一些副作用来改变这个副本,原来的元素仍然保持不变。
按值传递的示例:
int f(int a)   /* argument a is passed by value (local variable containing a copy)  */ 
{
    a++;      /* increments the local variable */
    return (a+5);   /* return a value */  
}

int main (int ac, char**av) {
    int b=7, c; 
    c = f(b);  /* b will be copied. The original value is unchanged */
    printf ("b=%d c=%d\n", b, c);  /* prints 7 and 13 */
}

传递引用的示例:

int fr(int* pa)   /* argument pa is a pointer refering to original value  */ 
{
    *pa+=1;      /* increments value pointed to (the original variable) */
    return (*pa+5);   /* return by value */  
}

int main (int ac, char**av) {
    int b=7, c; 
    c = fr(&b);  /* The original value in b is changed */
    printf ("b=%d c=%d\n", b, c);  /* prints 8 and 13 */
}

返回引用不够明显。例如,它用于返回作为参数接收到的引用或与之相关的引用。或者是指向动态分配对象的引用。


请问能否解释一下在C语言中如何实现。因为C语言没有对象。 - user2682811
5
C11标准将对象定义为“在执行环境中的数据存储区域,其内容可以表示值”(第3.15节)。如果您喜欢,可以将其视为变量。 - Christophe
面向对象编程语言并不是发明了“对象”这个术语,它在计算机出现之前就是一个普通的英语词汇已经存在了几个世纪。最常见的意义是指“一块内存区域,语义上被视为一个有关联的整体单元,其状态对程序具有语义相关性”。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接