Follow Techotopia on Twitter

On-line Guides
All Guides
eBook Store
iOS / Android
Linux for Beginners
Office Productivity
Linux Installation
Linux Security
Linux Utilities
Linux Virtualization
Linux Kernel
System/Network Admin
Programming
Scripting Languages
Development Tools
Web Development
GUI Toolkits/Desktop
Databases
Mail Systems
openSolaris
Eclipse Documentation
Techotopia.com
Virtuatopia.com
Answertopia.com

How To Guides
Virtualization
General System Admin
Linux Security
Linux Filesystems
Web Servers
Graphics & Desktop
PC Hardware
Windows
Problem Solutions
Privacy Policy

  




 

 

The GNU C Programming Tutorial - Passing pointers correctly

Node:Passing pointers correctly, Next:, Previous:Variable parameters, Up:Variable parameters



Passing pointers correctly

You might be wondering why main calls the function get_values above with ampersands before the parameters --

get_values (&num1, &num2);

-- while the function itself is defined with asterisks before its parameters:

void get_values (int *num_ptr1, int *num_ptr2)
{
  *num_ptr1 = 10;
  *num_ptr2 = 20;
}

Think carefully for a moment about what is happening in these fragments of code. The variables num1 and num2 in main are ordinary integers, so when main prefixes them with ampersands (&) while passing them to get_values, it is really passing integer pointers. Remember, &num1 should be read as "the address of the variable num1".

The code reads like this:

get_values (&num1, &num2);

"Evaluate the function get_values, passing to it the
addresses at which the variables num1 and num2 are stored.".

The function get_values is defined like this:

void get_values (int *num_ptr1, int *num_ptr2)

"Define the function get_values.  It returns a void
value (so it operates only via "side effects" on the variable
parameters it is passed).  It takes two parameters, both of type
int *.  The first parameter is called num_ptr1 and is a
pointer to an integer value, and the second parameter is called
num_ptr2 and is also a pointer to an integer value.  When this
function is called, it must be passed the addresses of variables, not the
variables themselves."

Remember that declaring a variable with an asterisk (*) before it means "declare this variable to be a pointer", so the formal parameters of get_values are integer pointers. The parameters must be declared this way, because the main function sends the addresses of num1 and num2 -- that is, by the time the get_values function receives the parameters, they are already pointers -- hence their names in get_values: num_ptr1 and num_ptr2, rather than num1 and num2.

In effect, we are "matching up" the data types of num1 and num2 with those of num_ptr1 and num_ptr2, respectively, when we prefix num1 and num2 with ampersands while passing them, and prefix num_ptr1 and num_ptr2 with asterisks in the parameter list of the function get_values. We do not have to write num_ptr1 = &num1; and num_ptr2 = &num2; -- the calling convention does that for us.

Important! This is a general rule in C: when you pass actual parameters as pointers using ampersands (e.g. &num1, "the address of the variable num1"), you must use asterisks to declare as pointers the corresponding formal parameters in the function to which you pass them, (e.g. int *num_ptr1, "the contents of the location pointed to by num_ptr1").

 
 
  Published under free license. Design by Interspire