Pointer

Post on 11-Feb-2016

25 views 0 download

Tags:

description

Pointer. Tran, Van Hoai. Pointers and Addresses. Pointer: group of cells ( 2,4 cells ) Variable: group of cells Pointer is also a variable Each cell (or group of cells) has an address. Pointer. Variable. p. c. Memory cells. Pointers and Addresses. - PowerPoint PPT Presentation

Transcript of Pointer

PointerTran, Van Hoai

Pointers and Addresses

Pointer: group of cells (2,4 cells) Variable: group of cells Pointer is also a variable

Each cell (or group of cells) has an address

p c

Memory cells

Pointer Variable

Pointers and Addresses

&: get address of an object in memory The address of a pointer &p

p c

Memory cells

// assign the address of c to the variable pp = &c;

Variable in memory

Pointer, Variable in memory

Dereference

How to access the object the pointer points to? *: derefererencing operator *p and c access the same object

If p points to c, *p can occur in any context where c could do

p c

Example

int *ip; intended as a mnemonic (dễ nhớ) implying *ip is an int

/* how to declare */int x=1, y=2;int *ip; /* ip is pointer to int */

/* how to use */ip = &x; /* ip points to x */y = *ip; /* y is now valued to that */ /* of x, i.e., 1 */*ip = 0; /* x is now 0 */

More examples

/* how to declare */int x=1, y=2;int *ip; /* ip is pointer to int */int **ipp; /* ipp is a pointer to int* */

/* how to use */ip = &x; /* ip points to x */*ip += 1; /* x is now 2 */ipp = &x; /* invalid */ipp = &ip; /* ipp points to ip */**ipp = 5; /* x is now 5 */ *ipp = 2; /* invalid */*ipp = &y; /* ip points to y */**ipp = 3; /* y is now 3 */

Function arguments without pointer?

WRONG After

swap(a,b), a is still 1, b still 2

C passes arguments to functions by value only swap copies

of a and b

/* callee */void swap( int x, int y ){ int temp;

temp = x; x = y; y = temp;}

/* caller */int a=1, b=2;…swap( a, b );…

Why it does not work? No way to

return new values to a and b

b

1

2

a

caller

1

2

x

y

swap() (before actions)

passing values

swap() (after actions)

2

1

x

y

swapping values

How to swap values of a and b? Pointers passed

to function Actions

performed indirectly on variables of caller

/* callee */void swap( int *px, int *py ){ int temp;

temp = *px; *px = *py; *py = temp;}

/* caller */int a=1, b=2;…swap( &a, &b );…

Why it works? px points to a Accessing *px means accessing a

a

b

caller

px

py

swap()

Another way to return results to caller? Through return

mechanism How to return

more than 1 outputs? arguments

/* n! */int factorial( int n ){ int i, f=1;

for( i=1; i<=n; i++ ) f *= i; return f;}

int factorial( int *fac, int n ){ int i;

*fac = 1; if ( n<0 ) return 0; for( i=1; i<=n; i++ ) *fac *= i; return 1;}

Array and Pointer

int x=2;int *p; /* a pointer to int */int a[5]; /* array of 5 ints */

a[2]=x; /* a[2] is 2 */p=&a[2]; /* p points to 3rd element of a */*(p+2)=3; /* a[4] is 3 now */p=a; /* p points to a[0] */a=p; /* invalid */

2 3a

a[0] a[2]

2x p

a[4]

Pointer to Pointer(syntactic meaning) What is the meaning of

void myFunction( int **ipp ){ …}

Think syntactically in step ipp points to int* which points to int

Pointer to Pointer (semantic meaning) (1) Challenge

How to pass an array of ints to a function The function inserts an int into the array

/* ip: pointer to int *//* n: length of array *//* elm: element to be inserted */int insert( int *ip, int n, int elm ){ int i, j; for( i=0; i<n; i++ ) if ( ip[i] > elm ) /* insert position here */ break; if ( i<n ) /* move the rest forward */ for( j=n-1; j>=i; j-- ) /* 1 unit if needed */ ip[j+1] = ip[j]; ip[i] = elm; /* safe to insert now */ return n+1;}

Pointer to Pointer(semantic meaning) (2) The function increase the size of the array

if needed

/* ipp: pointer to pointer *//* s: size of array */int insert( int **ipp, int *n, int *s, int elm ){ int i, j, *p; if ( n+1 > s ){ /* re-allocate mem. if needed */ p = (int*)calloc( n+1, sizeof(int) ); memcpy( p, *ipp, n*sizeof(int) ); free( *ipp ); *ipp = p; } for( i=0; i<n; i++ ) /* find position to insert */ if ( p[i] > elm ) break; if ( i<n ) /* move the rest forward */ for( j=n-1; j>=i; j-- ) /* 1 unit if needed */ p[j+1] = p[j]; p[i] = elm; /* safe to insert now */ n = n+1; s = s+1; /* update new length and size */ return n+1;}

Pointer to Function In C, function is not a variable But pointer to function is possible

To be assigned To be placed in arrays To be passed to functions To be returned by functions …

How to declare There are similar functions

int intLeast(void *p,int n,void *e) int doubleLeast(void *p,int n,void *e)

Pointer variable to functions int (*pLeast)(void *,int,void *e); AssignmentpLeast = intLeast; Usage(*pLeast)( …, …, … )

Where to use (for example)? Look into example4.c

Confusion int *f()

function returning a pointer to int int (*f)()

pointer to function returning int

Examples

/* argv: pointer to string */char **argv/* daytab: pointer to array[13] of int */int (*daytab)[13]/* daytab: array[13] of pointers to int */int *daytab[13]/* comp: function returning pointer to void */void *comp()/* comp: function to pointer returning void */void (*comp)()

Memory organizationTran, Van Hoai

Three types Automatic storage (stack) Static storage Free storage (heap)

Stack Used for

Local objects not explicitly declared static or extern declared auto or register function arguments

Created automatically on stack when entering, Destroyed when exiting a block or function

Default value: indeterminate (không xác định)

Static Used for

Global, static (in functions) objects Created once, existing during program

execution Default value: binary zero

Heap (dynamic) Used for

dynamic memory allocation calloc(), malloc(), free()

Created, Destroyed explicitly in user C code

Default value: unspecified