Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
534 views
in Technique[技术] by (71.8m points)

c - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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
", 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
", 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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...