In C, all function parameters are passed by value, so modifying what is passed in callee functions won’t affect caller functions’ local variables.

#include <stdio.h>

void modify(int v) {
    printf("modify 1: %d\\n", v); /* 0 is printed */
    v = 42;
    printf("modify 2: %d\\n", v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\\n", v); /* 0 is printed */
    modify(v);
    printf("main 2: %d\\n", v); /* 0 is printed, not 42 */
    return 0;
}

You can use pointers to let callee functions modify caller functions’ local variables. Note that this is not pass by reference but the pointer values pointing at the local variables are passed.

#include <stdio.h>

void modify(int* v) {
    printf("modify 1: %d\\n", *v); /* 0 is printed */
    *v = 42;
    printf("modify 2: %d\\n", *v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\\n", v); /* 0 is printed */
    modify(&v);
    printf("main 2: %d\\n", v); /* 42 is printed */
    return 0;
}

However returning the address of a local variable to the callee results in undefined behaviour. See http://stackoverflow.com/documentation/c/364/undefined-behavior/2034/dereferencing-a-pointer-to-variable-beyond-its-lifetime#t=201608112325484278857.