Passing address, but it is working like call by value in C?

后端 未结 4 1767
南笙
南笙 2020-12-04 00:40

Hello I am a beginner in C programming language. Recently I read about call by value and call by address. I have learned that in call by address changes in the called functi

相关标签:
4条回答
  • 2020-12-04 01:14

    There is no such thing as call by address in C. There is only call by value. What one does when a function needs to modify an argument in a way that is visible to the caller is to have the caller pass a pointer to something, and have the called function write the update though that pointer. Note that the pointer itself is still sent as call-by-value - that is: the called function gets its own copy of the pointer and could change it to point to anything else if it wants to.

    0 讨论(0)
  • 2020-12-04 01:21

    You are simply setting the value of the pointer in the function, not the value of the pointed to variable. The function should use the following code:

    *ptr = y;

    This derefences the pointer (exposing the value pointed to), and therefore when you use the equals operator, the memory pointed at is modified, not the pointer itself. I hope this helps to clarify things.

    0 讨论(0)
  • 2020-12-04 01:32

    The function is assigning a new address to the pointer but the pointer itself is being passed by value, as all arguments are in C. To change the value of a pointer variable the address of the pointer itself must be passed:

    void change_by_add(int **ptr)
    {
        *ptr = &y;
    }
    
    change_by_add(&p);
    

    See C FAQ Question 4.8.

    Passing by reference does not exist in C but can be achieved by passing the address of the variable who's value is to be changed to a function. For example:

    void add_to_int(int* a_value, int a_increment)
    {
        *a_value += a_increment;
    }
    
    0 讨论(0)
  • 2020-12-04 01:36

    Changes made by called function does not get reflected by the caller because you are overriding the pointer address in the called function i.e ptr = &y;.

    Initially, you passed the address of x but you are changing it with the address of y.

    If you really want to implement the concept of call by address then change value instead of address.

    Example:

    void change_by_add(int *ptr) {
        *ptr = y;  //changing value
        printf("\nInside change_by_add\t %d",*ptr);
    }
    
    void main(){
        int *p;
        p = &x;
        change_by_add(p);
        printf("\nInside main\t %d \n", *p);
        return 0;
    }
    

    Output

    Inside change_by_add     20
    Inside main  20
    
    0 讨论(0)
提交回复
热议问题