Home > Back-end >  Can someone explain what is happening here.Why I don't get the answer of y as 6
Can someone explain what is happening here.Why I don't get the answer of y as 6

Time:09-30

#include <stdio.h>

int f1(int *x, int y) {
    y  ;
    (*x)  ;
    return *x   y;
}

int main() {
    int x = 10, y = 5;
    int z = f1(&x, y);
    printf("x=%d y=%d z=%d\n", x, y, z);
}

I get the answer as x=11 y=5 z=17. Can someone explain this?

CodePudding user response:

Check the comments.

#include <stdio.h>

int f1(int *x,int y)
{
    y  ;  // incrementing y, which was 5, to 6.
    (*x)  ;  // incrementing the value-at-address-x, which was 10, to 11
    return *x y;  // add value-at-address-x, 11, and value of y, 6 == 17, return that.
}

int main(void)          //correct signature of main in hosted environment
{
    int x=10,y=5;
    int z=f1(&x,y);
       //any changes made to the value stored at address x will reflect here, 
       // any changes made to the value of y will be local to the function call.

    printf("x=%d y=%d z=%d\n",x,y,z);
       // updated x, unchanged y, and returned z.

}

CodePudding user response:

The formal arguments x and y in f1 are different objects in memory from the variables x and y in main.

When you call z=f1(&x, y);, the expressions &x and y are fully evaluated and the results of those expressions are copied to the formal parameters x and y (this is what we mean when we say C passes function arguments by value).

So the formal parameter x stores the address of the variable x and the formal parameter y stores the value 5.

Since the formal parameter y is a different object in memory from the variable y, changing its value has no effect on the y in main.

The expression *x is f1 acts as kinda-sorta an alias for the variable x, so changing the value of *x in f1 does change the value of x in main.

  • Related