Pointers Programming Applications. Pointer A pointer is a variable whose value is a memory address...

Post on 17-Jan-2016

219 views 0 download

Transcript of Pointers Programming Applications. Pointer A pointer is a variable whose value is a memory address...

PointersProgramming Applications

Pointer• A pointer is a variable whose value is a

memory address representing the location of the chunk of memory on either the run-time stack or on the heap.

• Pointers have names, values and types.

• Value of p versus value pointed to by p

24

p

Pointer

The definition of pointer is

Int *p; float *p1; char *p2;

Which means that p is a pointer to integer

data in memory and p1 is a pointer to floating

point data in memory

Declaring pointer variables

it is not enough to say that a variable is a pointer. You also have to specify the type of variable to which the pointer points ! int * p1; // p1 points to an integer float * p2; // p2 points to a float

Exception: generic pointers (void *) indicate that the pointed data type is unknown may be used with explicit type cast to any type (type *) void * p;

type * variable_name ;

Pointer using To use the pointer: int *p, k;

K=10;P= &k;

Means that p has the address of k in memory Then &k means the address of k and *p

means the value in address p

Examplemain(){int v1=11, v2=22, *p;p=&v1;printf(“%d”, p);p=&v2;printf(“%d”, p);printf(“%d”, *p);}

Examplemain(){

int v1=11, v2=22, *p;p=&v1;printf(“%d”, p);*p=33;printf(“%d \n %d”, p, *p);

}

Examplemain(){

int v1=11, v2, *p;p=&v1;printf(“%d”, p);v2=*p;printf(“%d %d”, p, v2);

}

Pointer int u=3, v;

int *pu, *pv;

pu= &u;

v= *pu;

Pv=&v;

Printf(“%d %d %d %d”, u, &u, pu, *pu);

Printf(“\n %d %d %d %d”, v, &v, pv, *pv);

Pointer

int u1, u2, v=3;

int *pv;

u1 = 2 * (v+5);

pv = &v;

u2 = 2 * (*pv +5);

printf(“ %d %d”, u1, u2);

Traceint x,y; int * px;

x = 5; px = &x;

printf("x = %d\n", x); printf("x = %d\n", *px);

y = *px; printf("y = %d\n", y);

*px = 10; printf("x = %d\n", x);

printf("x = %d\n", *px); px = &y;

*px = 15; printf("x = %d\n", x);

printf("y = %d\n", y);

printf("what = %d\n", *px);

Traceint x,z; float y; char ch, *chp;

int *ip1, *ip2; float *fp;

x = 100; y = 20.0; z = 50;

ip1 = &x; ip2 = &z; fp = &y; chp = &ch;

ip2 = ip1; ip1 = &z; *ip1 = *ip2;

*ip1 = 200; *ip1 = *ip2 + 300; *fp = 1.2;

printf("%f\n", *fp);

printf("%d\n", ip1);

printf("%d\n", *ip1);

Pointer and array If we define the array

int x[5]={2, 1, 5, 6, 8} The variable x only means pointer to the first

element of array x[] If we define pointer int *p; Then we can use p as

p = &x[0]

Which means that p is pointer to first element or p = x

Pointer and array

Both x and p can be used as

printf(“%d”, *(x+2)); means the x[2]

printf(“%d”, *(p+1)); means the x[1]

printf(“%d”, (*x+2)); means the x[0]+2

Pointer

Int x[8] = {10, 20, 30, 40, 50, 60, 70, 80,};

Printf(“%d %d %d %d %d”, x, x+2, *x, (*x+2),

*(x+2));

Example

float list[10], *p1;

for(int i=0; i<10;i++, p1++)

*p1=i;

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

printf(“%f”, *(pt-i));

Function and Pointer

We can call function by value f(s)

Or call function by reference f(&s)

Or define pointer p = &s and call function f(p)

Function and pointer

In the function call by value, any modification

held in the function will not affect the original

value

In call of reference, the modification in

function affect the original value.

Examplevoid set (int x);int main(void){int x=10,y=11;set(x); set(y);printf(“%d%d”, x,y);}void set (int x){int y=x+2; x*=2;}

Examplevoid set (int *x);int main(void){int x=10,y=11;set(&x); set(&y);printf(“%d%d”, x,y);}void set (int *x){int y=*x+2; *x*=2;}

Examplevoid set (int &);int main(void){int x=10,y=11;set(&x); set(&y);printf(“%d%d”, x,y);}void set (int &x){int y=x+2; x *=2;}

Passing arrayvoid cent (double *);void main(){double varray[5]={10.0, 43.1, 95.9, 59.7, 87.3};cent(varray);for(int j=0; j<5; j++) printf(“%d”, varray[j]);}void cent (double *pt){

for(int j=0; j<5; j++)*pt++ *= 2.54;

}

Pointer & Stringvoid disp ( char *);void main() {char str[] = “Idel people have the …”;disp(str);}void disp (char *ps){while (*ps != “\0”)printf(“%c”, *ps++);}

Array of string pointer

We can define array of pointer to strings as:

char * arrstr[7]={“Saturday”, “Sunday”, “Monday”,

“Tuesday”, “Wednesday”, “Thursday”, “Friday”}

for (int j=0; j<7; j++) printf(“%s”, arrstr[j]);

Example

float list[10] ={1, 5, 6, 9, 10, 0, 45, 4, 61, 7};

float *p, *d;

P=list; d=&list[9];

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

printf(“%f”, *(p+i),*(d-i) );

#include<stdio.h>Void push(int *, int);Void pop (int *);

Main(){ int *p, value;For(int t=0; t<5;t++) {scanf(“%d”, &value);

push(p, value);}Pop(p); pop(p);}Void push(int *p, int v){ p++; *p=v;}

void pop (int *p){printf(“%d”, *(p--));}

Trace#include<stdio.h>

Int f (int);

Void main()

{Int y=f(0);

Int z = f(4);

Printf (“ %d \t %d \n “, y, z);

}

int f(int x)

{if (x==0) return 0;

Else if (x>=1) return x+f(x-1);

}

Example

Using pointer, write a program that read a list

of numbers and sort them using swap function

which accept two pointers to elements in this

list and swap them.

Example

Write a program to read group of numbers

from the user and then average them after

stored them in an array and print the result.

You should use pointer as possible.

Example

Write a function String which accept as

argument the pointer to string and convert the

string to all upper case. You can use the

toupper() library function which takes a

single character and return this character in

upper case.

NULL pointers Values of a pointer variable:

Usually the value of a pointer variable is a pointer to some other variable Another value a pointer may have: it may be set to a null pointer

A null pointer is a special pointer value that is known not to point anywhere. No other valid pointer, to any other variable, will ever compare equal to a null

pointer ! Predefined constant NULL, defined in <stdio.h> Good practice: test for a null pointer before inspecting the value pointed !

#include <stdio.h>

int *ip = NULL ;

if(ip != NULL) printf("%d\n", *ip) ;

if(ip ) printf("%d\n", *ip) ;

Never use uninitialized pointers.

To increment a dereferenced pointer, use

(*p)++

rather than

*p++ /* correct but means … */

Generic Pointers and NULL• Java: a reference to "any" kind of object use a variable of type Object• C: a reference to "any" kind of object use a variable of type void*

void *p;

defines a generic, or typeless pointer p. Often casted to (T*)p

• NULL value can be assigned to any pointer, no matter what its type.

Generic Pointers and NULL void *p = NULL;

int i = 2; int *ip = &i;

p = ip; printf("%d", *p);

printf("%d", *((int*)p ) );

Pointer Expressions and Pointer Arithmetic

pv+n pv + n*sizeof(variable type that pointer point to)

Arithmetic operations can be performed on pointers Increment/decrement pointer (++ or --)

Example:

++vPtr, vPtr++,

--vPtr, vPtr--

Add an integer to a pointer( + or += , - or -=) Pointers may be subtracted from each other Operations meaningless unless performed on an array