data variable and pointer variable pass by reference pointer arithmetic passing array using pointers...

Post on 26-Mar-2015

263 Views

Category:

Documents

8 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Data Variable and Pointer VariablePass by ReferencePointer Arithmetic

Passing Array Using PointersDynamic Allocation

Address VS. ValueEach memory cell could store some VALUE.Each cell has an ADDRESS associated with it.

Note: Don’t confuse the address referring to a memory location with the value stored in that location.

PointerJust another C variable whose value is an address of

another variable.

“Points to” that other variable.

Declaring a pointerSyntax:

<data_type > *<pointer_name>;

Examples:int *ptr;char *cp;float *fp;

Note: <data_type > is the type of the data the pointer points to.

Declaring a pointerAfter declaring a pointer:

int *ptr;

ptr doesn’t actually point to anything yet. (null pointer)We can either:

make it point to something that already existsallocate room in memory for something new that it will

point to

Declaring a pointerDeclaring a pointer just allocates space to hold the

pointer; it does not allocate something to be pointed to.

If local variables in C are not initialized, they may contain anything.

Operators Associated with PointersReference operator (&)

Also known as the address operator Read as “address of”

Dereference operator (*) Read as ”value pointed by”

Reference Operator (&)The address that locates a variable within memory is

what we call a reference to that variable.

Example: int andy;

int *ted;

ted = &andy;

Reference Operator (&)Example:

andy = 25;fred = andy;ted = &andy;

Dereference Operator (*)Using a pointer we can directly access the value stored

in the variable which it points to.Example:

beth = *ted; /* beth is equal to value pointed by ted */

Dereference Operator (*)Differentiate:

beth = ted; /* beth equal to ted ( 1776 ) */

beth = *ted; /* beth equal to value pointed by ted ( 25 ) */

Note:Reference and dereference operators have complementary

(or opposite) meanings. A variable referenced with & can be dereferenced with *.

PointersExamples:

andy = 25; ted = &andy;

After these expressions:andy = 25 &andy = 1776 ted = 1776 *ted = 25

Pointers

13

Data Variable

int x=5;

x=5&x

address data

Pointer Variable

int x=5;

int *p;

p=&x;

printf(“%p”, p);

printf(“%d”, *p);

the data inside address p

x=5&x=FF00

p=address

(FF00)

14

Sample Program : Pointers

1 /* Filename: Pointers.c

Program Description: Pointer example

*/

Predict the output:

2

3

4

5

6

7

8

9

10

11

12

#include<stdio.h>

main()

{

int count, value;

int *count_address;

count = 100;

count_address=&count;

value= *count_address;

printf(“\n %p”, count_address);

printf(“\n %d”, value);

getch();

}

13

14

15

16

17

18

19

20

Pointers

Review: Parameter PassingTwo Ways:

Pass by ValuePass by Reference

Review: Pass by Valueint cubeByValue( int );

main(){ int n = 5;

printf(“Original value: %d”, n);n = cubeByValue( n );printf(“\nNew value: %d”, n);getch();

)

int cubeByValue( int n ){

return n * n * n;}

Example 1: Pass by Referenceint cubeByReference( int * );

main(){ int n = 5;

printf(“Original value: %d”, n);n = cubeByReference( &n );printf(“\nNew value: %d”, n);getch();

)

int cubeByReference( int *nPtr ){

*nPtr = *nPtr * *nPtr * *nPtr;return *nPtr;

}

Example 2: Pass by Referencevoid cubeByReference( int * );

main(){ int n = 5;

printf(“Original value: %d”, n);cubeByReference( &n );printf(“\nNew value: %d”, n);getch();

}

void cubeByReference( int *nPtr ){

*nPtr = *nPtr * *nPtr * *nPtr;}

Exercise:Create a function that would swap two numbers. The

numbers must be pass as parameters of that function:

Using pass by value

Using pass by reference

Pointer ArithmeticPointers only have limited set of operations:

A pointer could be incremented (++) and decremented (--)An integer may be added (+, +=) to a pointerAn integer may be subtracted (-, -=) from a pointerOne pointer may be subtracted from another

Pointer Arithmeticint v[5];

vPtr can be initialized by: vPtr = v; vPtr = &v[0];

The diagram considers a machine (computer) with 4-byte integers.

3000

vPtr

59 8 7 6

v[0] v[1] v[2] v[3] v[4]

3000 3004 3008 3012 3016

Pointer Arithmetic

Example: vPtr += 2; Result: 3000 + 2 * 4 = 3008

3000

vPtr

59 8 7 6

v[0] v[1] v[2] v[3] v[4]

3000 3004 3008 3012 3016

3008

vPtr

Pointer ArithmeticFor arrays of other data types, vPtr would be incremented by

twice the number of bytes that it takes to store an object of that data type.

Example: char v[5];

vPtr += 2; Result: 3000 + 2 * 1 = 3002

3000

vPtr

‘5’‘9’ ‘8’ ‘7’ ‘6’

v[0] v[1] v[2] v[3] v[4]

3000 3001 3002 3003 3004

3002

vPtr

Pointer ArithmeticSame case of a 2-byte integer machine.

Example: int v[5];

vPtr += 2; Result: 3000 + 2 * 2 = 3004

Most computers have 2-byte or 4-byte integers. Some newer ones uses 8-byte machines. Because of this, pointer arithmetic is machine-dependent.

3000

vPtr‘5’‘9’ ‘8’ ‘7’ ‘6’

v[0] v[1] v[2] v[3] v[4]

3000 3002 3004 3006 3008

3004

vPtr

Pointer Arithmetic

If these are conducted in sequence:

vPtr is incremented to 3016: vPtr += 4;vPtr is set back to address 3000: vPtr -= 4;To increment vPtr: ++vPtr; or vPtr++;To decrement vPtr: --vPtr; or vPtr--;

3000

vPtr

59 8 7 6

v[0] v[1] v[2] v[3] v[4]

3000 3004 3008 3012 3016

Pointer Arithmetic

What would be the value of x?

x = v2Ptr – vPtr;

Pointer arithmetic is meaningless unless performed on an array.

3000

vPtr

59 8 7 6

v[0] v[1] v[2] v[3] v[4]

3000 3004 3008 3012 3016

3008

v2Ptr

Pointer ArithmeticPointers can be compared using equality and relational

operators, but is meaningless unless pointers point to members of the same array.

Pointer comparisons compare the addresses stored in the pointers.

Generic PointersA pointer can be assigned to another pointer if both pointers

are of the same type.*a = *b;

Otherwise, a cast operator must be used to convert the pointer.

*a = * (int *) b;

Generic PointersException:

pointer to void (i.e. void *)

Generic pointers can represent any pointer type.

A cast operation is not required but we can cast any data variable as a pointer to void.

A pointer to void cannot be dereferenced.

Example: Generic Pointersmain(){ int i; char c; void *v; clrscr();

i = 6; c = 'a';

v = &i; printf(“v points to %d\n", *(int *) v);

v= &c; printf(“v now points to %c\n", *(char *) v);

getch();}

Pointer ArithmeticVALID:

Add an integer to a pointer.

Subtract an integer from a pointer.

Subtract 2 pointers (from the same array).

Compare pointers (<, <=, ==, !=, >, >=).

Compare pointer to NULL (indicates that pointer points to nothing).

INVALID:

Adding 2 pointers.

Multiplying pointers.

Dividing pointers.

Subtracting a pointer from integer.

Add or subtract type float or double to or from pointers.

Pointer ArithmeticPredict the output:

int x[5] = { 1, 2, 3, 4, 5 }; printf(“\n %d”, *p1 ); int *p1; x[2] = *p1 + p1[2]; p1 = x; printf(“\n %d”, x[2] ); p1++;

Arrays and PointersArrays and pointers are closely related

An array name is a constant pointer

The name of the arrays points to the address/location of the first element of the array.

Constant pointer means that it’s value (address/reference) could not be changed.

Using ARRAY INDEXING:

Arrays and Pointers

v59 8 7 6

v[0] v[1] v[2] v[3] v[4]

3000 3002 3004 3006 3008int v[5];

Using POINTER MANIPULATION:

Pointers can also be subscripted (indexed) exactly like arrays can. This is referred to as pointer/subscript notation.

Arrays and Pointers

int v[5];int *p = v;

59 8 7 6

p[0] p[1] p[2] p[3] p[4]

3000 3002 3004 3006 3008

3000

p

Using POINTER MANIPULATION:

Using pointer arithmetic, the array could be traversed.

Arrays and Pointers

int v[5];int *p = v;

p++;p += 3;*p--;

59 8 7 6

p[0] p[1] p[2] p[3] p[4]

3000 3002 3004 3006 30083000

p

Passing Arrays using PointersSample Program : Passing Array Using Pointer

1 /* Filename: ArrayPtr.c

Program Description: Display the string character by character

*/

Predict the output:

2

3

4

5

6

7

8

9

10

11

12

#include<stdio.h>

void Display(char *p);

main()

{

char str[6] = “hello”;

Display( str );

getch();

}

void Display( char *p )

{

while( *p )

{

putchar( *p );

p++;

}

}

13

14

15

16

17

18

19

20

Double PointersA pointer whose value is the address of another pointer.

Also called as a Pointers to pointers (i.e. pointers to int, pointers to char, etc.)

Syntax:int **ptr;char **a;

Double PointersExample:

int **ipp;int i = 5, j = 6; k = 7; int *ip1 = &i, *ip2 = &j;

ipp = &ip1;

75 6

i j k

3000 … 4FF1 … … 581C

123D

ipp

3000

ip1

123D

4FF1

ip2

54EA

POINTER VALUES:

*ipp = 3000**ipp = 5

Double PointersExample:

*ipp = ip2;

POINTER VALUES:

*ipp = 4FF1**ipp = 6

75 6

i j k

3000 … 4FF1 … … 581C

123D

ipp

4FF1

ip1

123D

4FF1

ip2

54EA

Double PointersExample:

*ipp = &k;

POINTER VALUES:

*ipp = 581C**ipp = 7

75 6

i j k

3000 … 4FF1 … … 581C

123D

ipp

581C

ip1

123D

4FF1

ip2

54EA

Dynamic Memory AllocationAllows to programmers to allocate (reserve) memory

dynamically.

Obtain more memory space at execution time.

Common Library functions associated:malloc()free()sizeof()

Dynamic Memory AllocationSample Program : Dynamic Allocation

/* Filename: Dynamic.c

Program Description: Using malloc

*/

Output:

5

10

20

30

40

#include<stdio.h>

main()

{

int *p1,x;

int *p[4];

p1=(int *) malloc(sizeof(int));

*p1= 5;

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

p[0] = (int *) malloc( sizeof( int ));

p[1] = (int *) malloc( sizeof ( int));

p[2] = (int *) malloc( sizeof( int ));

p[3] = (int *) malloc( sizeof( int ));

*p[0] = 10; *p[1] = 20;

*p[2] = 30; *p[3] = 40;

for(x=0; x<4; x++)

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

for(x=0; x<4; x++)

free( p[x] );

getch();

}

PointersEXERCISE (By pairs):

1. Make a function that accepts a pointer to a string and determine how many letter A’s are there in the string.

2. Make a function that accepts an array of n integers and returns the average of these integers. Implement using pointers.

NOTES

45

http://www.pcblab.net78.net/forum/(PCBLab Forum > ComE Subjects > ComE 211)

top related