Loading in 5 sec....

C programming---PointersPowerPoint Presentation

C programming---Pointers

- 86 Views
- Uploaded on
- Presentation posted in: General

C programming---Pointers

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

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:

Each byte has a unique address in memory.

Address

Contents

0

1

2

3

n-1

int i = 9;/* suppose sizeof(int) = 4

The address of variable i is 0xFA83

0xFA83

0xFA84

0xFA85

0xFA86

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

int *p; // p is a pointer variable capable of pointing to objects of type int

char *str;

double *q;

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.

- int i, *p;
- …….
- p = &i;
- int i;
- int *p = &i;
- int i, p = &i;

printf(“%d\n”, *p);

j = *&i;

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);

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

int i, j, *p, *q;

p = *i;

q = p;

p

i

q

int i, j, *p, *q;

p = &i;

q = &j;

*q = *p;

p

i

q

Example 2.c

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”

}

int *max(int *a, int *b)

{

if(*a > *b)

return a;

else

return b;

}

int *p = max(&a, &b);

int *f(void)

{

int a;

……

return &a;

}

Pointer Arithmetic

int a[10], *p;

p = &a[0];

a

p

p

q

p = &a[2];

q = p + 3;

p += 4;

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)

#define N 10

int a[N], sum, *p;

sum = 0;

for(p = &a[0]; p < &a[N]; p++)

sum += *p;

*p++ or *(p++)

(*p)++

*++p or *(++p)

++*p or ++(*p)

The postfix version of ++ takes precedence over *

See 3.c

int a[10];

*a = 7; // modify a[0]

*(a + 2) = 13; // modify a[2]

while( *a != 0 )

a++; // wrong

int find_largest(int a[], int n)

{

}

int find_largest(int *a, int n)

{

}

#define N 10

…..

int a[N], i, sum = 0, *p = a;

…..

for(i =0; i < N; i++)

sum += p[i];

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_ROWS-1][NUM_COLS]; p++)

*p = 0;