Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what is value- and reference semantics and the difference

What is value semantics and reference semantics and what is the difference between them? Can you please show me with an example in c.

I guess in reference semantics that you just send an pointer to another function then it is reference semantics? I find it hard to grasp what value semantics is? If I only use an int as an argument and then let say return an int from that function then the function uses value semantics? And how does side effects affect this? There must be other examples of value semantics then I mentioned if I were right about it. Can you please give me examples of that. If a function takes a pointer as argument and the functions return value is an int, does the function make use of both reference- and value semantics?

like image 476
user2682811 Avatar asked Nov 23 '14 00:11

user2682811


1 Answers

In the reference semantic, an argument refers to the original object, being it for reading or for writing.

In the value semantic, an argument is just the value of an object, i.e. a copy instead of the original. Of course, if you alter this copy with some side effects, the original element remains unchanged.

Example of passing by value:

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 */
}

Example of passing by reference:

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 */
}

Returning by reference is less obvious. Tt's used for example to return a reference received as argument, or related to it. Or a reference to a dynamically allocated object.

like image 54
Christophe Avatar answered Nov 15 '22 22:11

Christophe