Vous êtes sur la page 1sur 33

Pointers in C

Addressing Concept
Pointer stores the address of another entity It refers to a memory location

int i = 5; int *ptr; ptr = &i; printf(*ptr = %d\n, *ptr); /* declare a pointer variable */ /* store address-of i to ptr */ /* refer to referee of ptr */

Why do we need Pointer?


Simply because its there! It is used in some circumstances in C

Remember this? scanf(%d, &i);

What actually ptr is?


ptr is a variable storing an address ptr is NOT storing the actual value of i

int i = 5; int *ptr; ptr = &i; printf(i = %d\n, i); printf(*ptr = %d\n, *ptr); printf(ptr = %p\n, ptr);

ptr
i
Output:
i = 5 *ptr = 5 ptr = 65522

address of i
5
value of ptr = address of i in memory
4

Twin Operators

&: Address-of operator

Get the address of an entity

e.g. ptr = &j;


Addr Content 1001 j: 33 Addr Content 1002 1006 k: 58 Addr Content 1003 1007 m: 74

Addr Content 1000 1004 i: 40

ptr: 1001 1005

Twin Operators

*: De-reference operator

Refer to the content of the referee

e.g. *ptr = 99;


Addr Content 1001 j: 99 Addr Content 1002 1006 k: 58 Addr Content 1003 1007 m: 74

Addr Content 1000 1004 i: 40

ptr: 1001 1005

Example: Pass by Reference

Modify behaviour in argument passing


void f(int j) { void f(int *ptr) {

j = 5;
} Void main() { int i = 3; f(i); Printf(%d,i) } }

*ptr = 5;
Void main() { int i = 3;

i=?

f(&i); }

i=?

i=3

i=5
7

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 5

int

integer variable

10

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2; /* declare a pointer-to-integer variable */

Data Table Name i Type int Description integer variable Value 5

j
ptr

int
int *

integer variable
integer pointer variable

10

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2; /* declare a pointer-to-pointer-to-integer variable */

Data Table Name i Type int Description integer variable Value 5

j
ptr pptr

int
int *

integer variable
integer pointer variable

10

int ** integer pointer pointer variable Double


10

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2; /* store address-of i to ptr */

Data Table Name i Type int Description integer variable Value 5

j
ptr pptr *ptr

int
int * int

integer variable
integer pointer variable de-reference of ptr

10
address of i 5
11

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; /* store address-of ptr to pptr */ *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 5

j
ptr pptr *pptr

int
int * int *

integer variable
integer pointer variable de-reference of pptr

10
address of i address of ptr value of ptr (address of i)
12

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 3

j
ptr pptr *ptr

int
int * int

integer variable
integer pointer variable de-reference of ptr

10
address of i address of ptr 3
13

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 7

j
ptr pptr **pptr

int
int * int

integer variable
integer pointer variable de-reference of de-reference of pptr

10
address of i address of ptr 7
14

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 7

j
ptr pptr *ptr

int
int * int

integer variable
integer pointer variable de-reference of ptr

10
address of j address of ptr 10
15

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 7

j
ptr pptr **pptr

int
int * int

integer variable
integer pointer variable de-reference of de-reference of pptr

9
address of j address of ptr 9
16

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value 7

j
ptr pptr *pptr

int
int * int *

integer variable
integer pointer variable de-reference of pptr

9
address of i address of ptr value of ptr (address of i)
17

int ** integer pointer pointer variable

An Illustration
int i = 5, j = 10;
int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7; ptr = &j; **pptr = 9; *pptr = &i; *ptr = -2;

Data Table Name i Type int Description integer variable Value -2

j
ptr pptr *ptr

int
int * int

integer variable
integer pointer variable de-reference of ptr

9
address of i address of ptr -2
18

int ** integer pointer pointer variable

Pointer Arithmetic

Whats ptr + 1?

The The

next memory location! Whats ptr - 1? previous memory location! Whats ptr * 2 and ptr / 2?
Invalid

operations!!!
19

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? ? ? ?

float * float pointer variable

20

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? ? ? address of a[2] ?

float * float pointer variable

21

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? 3.14 ? address of a[2] 3.14

float * float pointer variable

22

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? 3.14 ? address of a[3] ?

float * float pointer variable

23

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? 3.14 9.0 address of a[3] 9.0

float * float pointer variable

24

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value ? ? 3.14 9.0 address of a[0] ?

float * float pointer variable

25

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value 6.0 ? 3.14 9.0 address of a[0] 6.0

float * float pointer variable

26

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value 6.0 ? 3.14 9.0 address of a[2] 3.14

float * float pointer variable

27

Pointer Arithmetic and Array


float a[4];
float *ptr; ptr = &(a[2]); *ptr = 3.14; ptr++; *ptr = 9.0; ptr = ptr - 3; *ptr = 6.0; ptr += 2; *ptr = 7.0;

Data Table Name a[0] a[1] a[2] a[3] ptr *ptr Type float float float float float Description float array element (variable) float array element (variable) float array element (variable) float array element (variable) de-reference of float pointer variable Value 6.0 ? 7.0 9.0 address of a[2] 7.0

float * float pointer variable

28

Pointer Arithmetic and Array


float a[4]; float *ptr; ptr = &(a[2]); *ptr = 3.14;

Type of a is float * a[2] *(a + 2)


ptr = &(a[2]) ptr = &(*(a + 2)) ptr = a + 2

ptr++;
*ptr = 9.0; ptr = ptr - 3; *ptr = 6.0;

ptr += 2;
*ptr = 7.0;

a is a memory address constant ptr is a pointer variable

29

More Pointer Arithmetic


What if a is a double array? A double may occupy more memory slots!

Given double *ptr = a; Whats ptr + 1 then?


Addr Content 1001 1005 1009 Addr Content 1002 1006 1010 Addr Content 1003 1007 1011
30

Addr Content 1000 1004 1008 a[0]: 37.9 a[1]: 1.23 a[2]: 3.14

More Pointer Arithmetic


Arithmetic operators + and auto-adjust the address offset According to the type of the pointer:

1000 + sizeof(double) = 1000 + 4 = 1004


Addr Content 1001 1005 1009 Addr Content 1002 1006 1010 Addr Content 1003 1007 1011
31

Addr Content 1000 1004 1008 a[0]: 37.9 a[1]: 1.23 a[2]: 3.14

Advice and Precaution

Pros

Efficiency Convenience Error-prone Difficult to debug

Cons

32

Summary
A pointer stores the address (memory location) of another entity Address-of operator (&) gets the address of an entity De-reference operator (*) makes a reference to the referee of a pointer Pointer and array Pointer arithmetic

33

Vous aimerez peut-être aussi