What is the difference between the following parameter passing mechanisms in C++?
void foo(int &x)
void foo(int *x)
void foo(int **x)
void foo(int *&am
void foo(int &x)
passes a reference to an integer. This is an input/output parameter and can be used like a regular integer in the function. Value gets passed back to the caller.
void food(int *x)
passes a pointer to an integer. This is an input/output parameter but it's used like a pointer and has to be dereferenced (e.g. *x = 100;
). You also need to check that it's not null.
void foo(int **x)
passes a pointer to a pointer to an integer. This is an input/output parameter of type integer pointer. Use this if you want to change the value of an integer point (e.g. *x = &m_myInt;
).
void foo(int *&x)
passes a reference to a pointer to an integer. Like above but no need to dereference the pointer variable (e.g. x = &m_myInt;
).
Hope that makes sense. I would recommend using typedefs to simplify the use of pointers and reference symbols.
Just adding: I think your spacing is misleading. Maybe things get a bit clearer if you change it.
The , &, * and so on is part of the type, so keep it with the type:
void foo(int& x)
void foo(int* x)
void foo(int** x)
void foo(int*& x)
int& is an reference to an int, int* is a pointer to an int, int** is a pointer to an pointer to an int, and so on. You still need to read the types from right to left - int*& being a reference to an pointer to an int. But that's consistent.
I think this is easier to read and represents better what is meant.