Parameter Passing


The full code for this program (which includes code to display values of variables as the code executes) can be found in: ptrParamRetVal.cpp.

Pass-by-reference and simulated pass-by-reference

// Pass-by-reference (simple swap)
void swap1(int &x, int &y) {
    int temp = x;
    x = y;
    y = temp;
}
 
 
 
// Simulated pass-by-reference (simple swap)
void swap2(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

In main:

int a = 1, b = 2, c = 3, d = 4;
 
swap1(a, b);
 
swap2(&c, &d);
 

Pass-by-value

// Pass-by-value with: primitive type, pointer, array
void passByValue(int x, int *y, int z[]) {
    x = 1;
    y = new int;
    *y = 2;
    *z = 3;
    z = new int[3];
    y = new int[2];
    *z = 4;
    *y = 5;
}

In main:

int e[4], f[4];
for (int i = 0; i < 4; i++)  
    e[i] = 3*i;
     
// f = e;  <---- assignment of arrays not allowed
 
for (int i = 0; i < 4; i++) 
    f[i] = e[i];
     
passByValue(a, &b, e);
 

Pass-by-reference

// Pass-by-reference with: primitive type, pointer
// Note that body of function is same as body of passByValue
void passByRef(int &x, int * &y, int *z) {
    x = 1;
    y = new int;
    *y = 2;
    *z = 3;
    z = new int[3];
    y = new int[2];
    *z = 4;
    *y = 5;
}
 
 
 
 
// Pass-by-reference with pointers: good use vs. bad use
void passByRef2(int * &x, int * &y) {
    int z[4];
    z[0] = 3;
    x = new int[2];
    y = z;
}
 
 
 
 
 

In main:

// passByRef(a, &b, f);  // nope
 
// passByRef(a, e, f);   // nope
 
 
 
int *g = new int[4];
for (int i = 0; i < 4; i++) 
    g[i] = f[i];
    
passByRef(a, g, f);
 
 
 
 
 
    
int *p = new int;
int *q = new int;
*p = *q = 8;
    
passByRef2(p, q);
 
 

Return values

// Return value: primitive value
int returnVal1() {
    int x = 4;
    return x;
}
 
 
 
// Return value: pointer (bad use)
int *returnVal2() {
    int x = 5;
    return &x;  // note: generates warning, but compiles
}
 
 
 
// Return value: pointer (good use)
int *returnVal3() {
    int *x = new int;
    *x = 6;
    return x;
}

In main:

int aa, *bb, *cc;
 
aa = returnVal1();

*bb = returnVal1();
 
 
 
bb = returnVal2();

cc = returnVal3();