Chapter 11: Pointers
Chapter 11
Pointers
1 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Variables
• In most modern computers, main memory is
divided into bytes, with each byte capable of
storing eight bits of information:
• Each byte has a unique address.
2 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Variables
• If there are n bytes in memory, we can think of
addresses as numbers that range from 0 to n – 1:
3 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Variables
• Each variable in a program occupies one or
more bytes of memory.
• The address of the first byte is said to be the
address of the variable.
• What is the address of the variable i ?
4 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Variables
• Addresses can be stored in special pointer
variables.
• When we store the address of a variable i in the
pointer variable p, we say that p “points to” i.
• A graphical representation:
5 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Declaring Pointer Variables
• When a pointer variable is declared, its name
must be preceded by an asterisk:
SYNTAX: type * identifier;
EXAMPLE: int *p;
• The value of the pointer variable p is a memory
address.
• p is a pointer variable capable of pointing to
objects of type int.
• We use the term object instead of variable since p
might point to an area of memory that doesn’t
belong to a variable. Copyright © 2008 W. W. Norton & Company.
6
All rights reserved.
Chapter 11: Pointers
Declaring Pointer Variables
• Pointer variables can appear in declarations along with
other variables:
int i, j, a[10], b[20], *p, *q;
• C requires that every pointer variable point only to
objects of a particular type (the referenced type):
int *p; /* points only to integers */
double *q; /* points only to doubles */
char *r; /* points only to characters */
• There are no restrictions on what the referenced type
may be.
7 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Address and Indirection Operators
• C provides a pair of operators designed
specifically for use with pointers.
– To find the address of a variable, we use the &
(address) operator.
– To gain access to the object that a pointer
points to, we use the * (indirection) operator.
8 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Address Operator
• Declaring a pointer variable sets aside space for a
pointer but doesn’t make it point to an object:
int *p; /* points nowhere in particular */
• It’s crucial to initialize p before we use it.
9 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Address Operator
• One way to initialize a pointer variable is to assign
it the address of a variable:
int i, *p;
…
p = &i;
• Assigning the address of i to the variable p makes
p point to i:
10 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Address Operator
• It’s also possible to initialize a pointer variable at
the time it’s declared:
int i;
int *p = &i;
• The declaration of i can even be combined with
the declaration of p:
int i, *p = &i;
11 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Indirection Operator
• Once a pointer variable points to an object, we can
use the * (indirection) operator to access what’s
stored in the object.
• If p points to i, we can print the value of i as
follows:
printf("%d\n", *p);
• Applying & to a variable produces a pointer to the
variable. Applying * to the pointer takes us back
to the original variable:
j = *&i; /* same as j = i; */
12 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Indirection Operator
• As long as p points to i, *p is an alias for i.
– *p has the same value as i.
– Changing the value of *p changes the value of i.
• The example on the next slide illustrates the
equivalence of *p and i.
13 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Indirection Operator
p = &i;
?
i = 1;
1
printf("%d\n", i); 1
printf("%d\n", *p); 1
*p = 2;
2
printf("%d\n", i); 2
printf("%d\n", *p); 2
14 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
The Indirection Operator
• Applying the indirection operator to an
uninitialized pointer variable causes undefined
behavior:
int *p;
printf("%d", *p); /*** WRONG ***/
• Assigning a value to *p is particularly dangerous:
int *p;
*p = 1; /*** WRONG ***/
15 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Assignment
• C allows the use of the assignment operator to
copy pointers of the same type.
• Assume that the following declaration is in effect:
int i, j, *p, *q;
• Example of pointer assignment:
p = &i;
?
16 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Assignment
• Another example of pointer assignment:
q = p;
q now points to the same place as p:
17 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Assignment
• Any number of pointer variables may point to the
same object.
• If p and q both point to i, we can change i by
assigning a new value to either *p or *q:
*p = 1;
1
*q = 2;
18 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Assignment
• Be careful not to confuse
q = p;
with
*q = *p;
• The first statement is a pointer assignment, but the
second is not.
• The example on the next slide shows the effect of
the second statement.
19 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointer Assignment
p = &i;
q = &j; ?
?
i = 1;
1
*q = *p;
1
1
20 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• In Chapter 9, we tried—and failed—to write a
decompose function that could modify its
arguments.
• By passing a pointer to a variable instead of the
value of the variable, decompose can be fixed.
21 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Arguments
#include <stdio.h>
void decompose(double x, long int_part, double frac_part);
int main(void)
{
long i = 0;
double d = 0.0;
decompose(3.1456, i, d); // call of the function
printf("%ld\t %f", i, d);
return 0;
}
void decompose(double x, long int_part, double frac_part)
{
int_part = (long)x;
Unfortunately, i and d won’t be affected
frac_part = x - int_part;
by the assignments to int_part and
}
frac_part.
22 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• New definition of decompose:
void decompose(double x, long *int_part,
double *frac_part)
{
*int_part = (long) x;
*frac_part = x - *int_part;
}
• Possible prototypes for decompose:
void decompose(double x, long *int_part,
double *frac_part);
void decompose(double, long *, double *);
23 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
A call of decompose
in which the &
Pointers as Arguments operator is missing:
decompose(3.14159
• A call of decompose: , i, d);
When decompose
decompose(3.14159, &i, &d);
stores values in
• As a result of the call, int_part *int_part and
*frac_part, it will
points to i and frac_part attempt to change
points to d: unknown memory
locations instead of
modifying i and d.
24 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• The first assignment in the body of decompose
converts the value of x to type long and stores it
in the object pointed to by int_part:
25 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• The second assignment stores x - *int_part
into the object that frac_part points to:
.14159
26 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• Arguments in calls of scanf are pointers:
int i;
…
scanf("%d", &i);
Without the &, scanf would be supplied with the
value of i.
27 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Arguments
• Although scanf’s arguments must be pointers,
it’s not always true that every argument needs the
& operator:
int i, *p;
…
p = &i;
scanf("%d", p);
• Using the & operator in the call would be wrong:
scanf("%d", &p); /*** WRONG ***/
28 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Using const to Protect Arguments
• When an argument is a pointer to a variable x, we
normally assume that x will be modified:
f(&x);
• It’s possible, though, that f merely needs to
examine the value of x, not change it.
• The reason for the pointer might be efficiency:
passing the value of a variable can waste time and
space if the variable requires a large amount of
storage.
29 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Using const to Protect Arguments
• We can use const to document that a function
won’t change an object whose address is passed to
the function.
• const goes in the parameter’s declaration, just
before the specification of its type:
void f(const int *p)
{
*p = 0; /*** WRONG ***/
}
Attempting to modify *p is an error that the
compiler will detect.
30 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Return Values
• Functions are allowed to return pointers:
int *max(int *a, int *b)
{
if (*a > *b)
return a;
else
return b;
}
• A call of the max function:
int *p, i, j;
…
p = max(&i, &j);
After the call, p points to either i or j.
31 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Return Values
• Although max returns one of the pointers passed to it
as an argument, that’s not the only possibility.
• A function could also return a pointer to an external
variable or to a static local variable.
• Never return a pointer to an automatic local variable:
int *f(void)
{
int i;
…
return &i;
}
The variable i won’t exist after f returns.
32 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Pointers as Return Values
• Pointers can point to array elements.
• If a is an array, then &a[i] is a pointer to
element i of a.
• It’s sometimes useful for a function to return a
pointer to one of the elements in an array.
• A function that returns a pointer to the middle
element of a, assuming that a has n elements:
int *find_middle(int a[], int n) {
return &a[n/2];
}
33 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Program: Finding the Largest and
Smallest Elements in an Array
• The maxmin.c program uses a function named
max_min to find the largest and smallest elements
in an array.
• Prototype for max_min:
void max_min(int a[], int n, int *max, int *min);
34 Copyright © 2008 W. W. Norton & Company.
All rights reserved.
Chapter 11: Pointers
Program: Finding the Largest and
Smallest Elements in an Array
• maxmin.c will read 10 numbers into an array, pass it
to the max_min function, and print the results:
Enter 10 numbers: 34 82 49 102 7 94 23 11 50 31
Largest: 102
Smallest: 7
35 Copyright © 2008 W. W. Norton & Company.
All rights reserved.