/* * ISA 563, Spring 2011 * Copyleft by Muhammad Abdulla */ #include #include /* * arg_passing.c -- Illustrates differences between "call by value" and "call by reference". */ void call_by_val (int m, int n) { printf("inside call_by_val: m = %d, n=%d (before change)\n", m, n); m++; n--; printf("inside call_by_val: m = %d, n=%d (after change)\n", m, n); } void call_by_ref (int *m, int *n) { int *p; printf("inside call_by_ref: m = %d, n=%d (before change)\n", *m, *n); *m += 1; *n -= 1; printf("inside call_by_ref: m = %d, n=%d (after change)\n", *m, *n); // now try to change the value of the pointers themselves p = m; m = n; n = p; printf("inside call_by_ref: m = %d, n=%d (after pointer swap)\n", *m, *n); } int main ( int argc, char *argv[] ) { int m = 10; int n = 20; if ( argc == 3 ) { m = atoi(argv[1]); n = atoi(argv[2]); } else if ( argc > 1 ) { fprintf(stderr, "Illegal args, going with default values: m = %d, n = %d\n", m, n); } // calling by value call_by_val(m, n); printf("after call_by_val: m = %d, n=%d (before change)\n\n", m, n); // calling by reference call_by_ref(&m, &n); printf("after call_by_ref: m = %d, n=%d (before change)\n", m, n); return 0; }