Pointers

advertisement
C programming---Pointers
The first step: visualizing what pointers represent at
the machine level. In most modern computers, main
memory is divided into bytes.
Each byte can hold 8 bits of information:
1
0
1
0
0
0
1
Each byte has a unique address in memory.
1
Address
Address
Contents
0
00110011
1
10101010
2
00000111
3
11111000
n-1
10000100
Address
int i = 9; /* suppose sizeof(int) = 4
The address of variable i is 0xFA83
0xFA83
0xFA84
0xFA85
0xFA86
Pointer Variables
Use a pointer variable p to store the address of a
variable i, and we say p “points to” i
0xFA83
0xFA84
0xFA85
0xFA86
p
0xFA83
Declaring Pointer Variables
int *p; // p is a pointer variable capable of
to objects of type int
char *str;
double *q;
pointing
C requires that every pointer variable point to objects
of a particular type(the referenced type)
There are no restrictions on what referenced
type may be. In fact, a pointer variable can even
point to another pointer.
The Address and Indirection
Operators
int i, *p;
…….
p = &i;
int i;
int *p = &i;
int i, p = &i;
The Address and Indirection
Operators
printf(“%d\n”, *p);
j = *&i;
The Address and Indirection
Operators
int i, *p = &i;
i = 1;
printf(“i = %d\n”, i);
printf(“*p = %d\n”, *p);
*p = 4;
printf(“i = %d\n”, i);
printf(“*p = %d\n”, *p);
Something to remember
Never apply the indirection operator to an
uninitialized pointer variable.
int *p;
printf(“%d”, *p);
Unless you know where a pointer points to, do
not make an assignment to the pointer
Pointer Assignment
int i, j, *p, *q;
p = *i;
q = p;
p
i
q
Pointer Assignment
int i, j, *p, *q;
p = &i;
q = &j;
*q = *p;
p
i
q
Pointer as Arguments
Example 2.c
Using const to Protect Arguments
When we call a function and pass it a pointer to a variable,
we normally assume that the function will modify the
variable.
Sometimes we just want to examine the value of a
variable, not change it.
Using pointer might be efficient: time and memory space
void f(const int *p)
{
*p = 0; // wrong: p is a pointer to a “constant integer”
}
Pointers as Return Values
int *max(int *a, int *b)
{
if(*a > *b)
return a;
else
return b;
}
int *p = max(&a, &b);
Be careful
int *f(void)
{
int a;
……
return &a;
}
Pointers and Arrays
Pointer Arithmetic
int a[10], *p;
p = &a[0];
a
p
Pointer Arithmetic
p
q
p = &a[2];
q = p + 3;
p += 4;
Comparing Pointers
Using the relational operators( <, <=, >, >=) and the equality operator
(== and !=)
int *p = &a[5];
int *q = &a[1];
The value of p <= q is 0(false)
The value of p >= q is 1(true)
Using Pointers for Array Processing
#define N 10
int a[N], sum, *p;
sum = 0;
for(p = &a[0]; p < &a[N]; p++)
sum += *p;
Combining the * and ++ Operators
*p++ or *(p++)
(*p)++
*++p or *(++p)
++*p or ++(*p)
The postfix version of ++ takes
precedence over *
See 3.c
Using an Array Name as a Pointer
int a[10];
*a = 7; // modify a[0]
*(a + 2) = 13; // modify a[2]
while( *a != 0 )
a++;
// wrong
Array Arguments
int find_largest(int a[], int n)
{
}
int find_largest(int *a, int n)
{
}
Using a Pointer as an Array Name
#define N 10
…..
int a[N], i, sum = 0, *p = a;
…..
for(i =0; i < N; i++)
sum += p[i];
Pointers and Multidimensional
Arrays
int a[NUM_ROWS][NUM_COLS];
int row, col;
for(row = 0; row < NUM_ROWS; row++)
for(row = 0; row < NUM_ROWS; row++)
a[row][col] = 0;
int *p;
for(p = &a[0][0]; p <= &a[NUM_ROWS1][NUM_COLS]; p++)
*p = 0;
Download