Next: Null Pointers, Previous: Pointer-Type Designators, Up: Pointers [Contents][Index]
The main use of a pointer value is to dereference it (access the
data it points at) with the unary ‘*’ operator. For instance,
*&i
is the value at i
’s address—which is just
i
. The two expressions are equivalent, provided &i
is
valid.
A pointer-dereference expression whose type is data (not a function) is an lvalue.
Pointers become really useful when we store them somewhere and use them later. Here’s a simple example to illustrate the practice:
{
int i;
int *ptr;
ptr = &i;
i = 5;
…
return *ptr; /* Returns 5, fetched from i
. */
}
This shows how to declare the variable ptr
as type
int *
(pointer to int
), store a pointer value into it
(pointing at i
), and use it later to get the value of the
object it points at (the value in i
).
Here is another example of using a pointer to a variable.
/* Define global variablei
. */ int i = 2; int foo (void) { /* Save global variablei
’s address. */ int *global_i = &i; /* Declare locali
, shadowing the globali
. */ int i = 5; /* Print value of globali
and value of locali
. */ printf ("global i: %d\nlocal i: %d\n", *global_i, i); return i; }
Of course, in a real program it would be much cleaner to use different
names for these two variables, rather than calling both of them
i
. But it is hard to illustrate this syntaxtical point with
clean code. If anyone can provide a useful example to illustrate
this point with, that would be welcome.
Next: Null Pointers, Previous: Pointer-Type Designators, Up: Pointers [Contents][Index]