pointer and array - gadjah mada...

41
POINTER AND ARRAY SUNU WIBIRAMA

Upload: hoangquynh

Post on 26-Mar-2018

236 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

POINTER AND ARRAYSUNU WIBIRAMA

Page 2: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Presentation Outline

• Basic Pointer

• Arrays

• Dynamic Memory Allocation

Page 3: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Basic Pointer

3

Page 4: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointers

A pointer is a reference to another variable (memory location) in a program– Used to change variables inside a function (reference

parameters)– Used in dynamic (on-the-fly) memory allocation

(especially of arrays)– Used in building complex data structures (linked lists,

stacks, queues, trees, etc.)

Page 5: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointer Basics

Variables are allocated at addresses in computer memory (address depends on computer/operating system)

Name of the variable is a reference to that memory addressA pointer variable contains a representation of an address of

another variable (P is a pointer variable in the following):

Page 6: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointer Variable Definition

Basic syntax: Type *Name

Examples:int *P;! /* P is var that can point to an int var */

float *Q;!/* Q is a float pointer */

char *R;! /* R is a char pointer */

More example:int *AP[5]; /* AP is an array of 5 pointers to ints */

– more on how to read complex declarations later

Page 7: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Writing Convention

• Mostly, we define pointer as: Type *Name

• But some books use:Type* Name

7

#include <stdio.h>#include <conio.h>

void main(){! int A;! int *P;! int* S;! A = 25;! P = &A;! S = &A;! printf("%i\n",*P);! printf("%i",*S);! getch();}

Result: 2525

Page 8: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Address (&) Operator

The address (&) operator can be used in front of any variable object in C -- the result of the operation is the location in memory of the variable

Syntax: &VariableReferenceExamples:

int V;int *P;int A[5];

&V /*memory location of integer variable V*/&(A[2]) /*memory location of array element 2 in array A*/&P /*memory location of pointer variable P*/

Page 9: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointer Variable Initialization/Assignment

NULL - pointer constant to non-existent address– used to indicate pointer points to nothing

Can initialize/assign pointer vars to NULL or use the address (&) op to get address of a variable– variable in the address operator must be of the right

type for the pointer (an integer pointer points only at integer variables)

Examples:int V;float W;int *P = &V; (correct)int *S = NULL; (correct)int *P = &W (error)

Page 10: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Indirection (*) Operator

A pointer variable contains a memory addressTo refer to the contents of the variable that the

pointer points to, we use indirection operatorSyntax: *PointerVariableExample:

int V = 101;

int *P = &V;

/* Then *P would refer to the contents of the */

/* variable V (in this case, the integer 101) */

printf(“%d”,*P); /* Prints 101 */

Page 11: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointers to Pointers

A pointer can also be made to point to a pointer variable (but the pointer must be of a type that allows it to point to a pointer)

Example:int V = 101;

int *P = &V;! /* P points to int V */

int **Q = &P;! /* Q points to int pointer P */

printf(“%d %d %d\n”,V,*P,**Q); /* prints 101 3 times */

Page 12: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Pointer Types

Pointers are generally of the same size (enough bytes to represent all possible memory addresses), but it is inappropriate to assign an address of one type of variable to a different type of pointer

Example:int V = 101;

float *P = &V; /* Generally results in a Warning */

Warning rather than error because C will allow you to do this (it is appropriate in certain situations)

Page 13: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Casting Pointers

When assigning a memory address of a variable of one type to a pointer that points to another type it is best to use the cast operator to indicate the cast is intentional (this will remove the warning)

Example:int V = 101;

float *P = (float *) &V; /* Casts int address to float pointer */

Removes warning, but is still a somewhat unsafe thing to do

Page 14: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

The General (void) Pointer

A void * is considered to be a general pointerNo cast is needed to assign an address to a void * or

from a void * to another pointer type

Example:int V = 101;

void *G = &V;! /* No warning */

float **P = &G; /* No warning */

Page 15: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Array

15

Page 16: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

16

Pointers and Arrays• In C/C++, there is a strong relationship between

pointers and arrays.• The declaration int a[10]; defines an array of 10

integers. The declaration int *p; defines p as a “pointer to an int”.

• The assignment p = a; makes p an alias for the array and sets p to point to the first element of the array. (We could also write p = &a[0];)

• We can now reference members of the array using either a or p a[4] = 9; p[3] = 7; int x = p[6] + a[4] * 2;

Page 17: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

17

More Pointers and Arrays• The name of an array is equivalent to a pointer to the first

element of the array.

• Therefore, if a is the name of an array, the expression a[ i ] is equivalent to *(a + i).

• It follows then that &a[ i ] and (a + i) are also equivalent. Both represent the address of the i-th element beyond a.

• On the other hand, if p is a pointer, then it may be used with a subscript as if it were the name of an array.

p[ i ] is identical to *(p + i)

In short, an array-and-index expression is equivalent to a pointer-and-offset expression and vice-versa.

Page 18: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

18

So, what’s the difference?

• If the name of an array is synonymous with a pointer to the first element of the array, then what’s the difference between an array name and a pointer?

• An array name can only “point” to the first element of its array. It can never point to anything else.

• A pointer may be changed to point to any variable or array of the appropriate type

Page 19: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

19

Array Name vs Pointer

int g, grades[ ] = {10, 20, 30, 40 }, myGrade = 100, yourGrade = 85, *pGrade;

/* grades can be (and usually is) used as array name */ for (g = 0; g < 4; g++) printf(“%d\n” grades[g]);

/* grades can be used as a pointer to its array if it doesn’t change*/ for (g = 0; g < 4; g++) printf(“%d\n” *(grades + g));

/* but grades can’t point anywhere else */ grades = &myGrade; /* compiler error */

/* pGrades can be an alias for grades and used like an array name */ pGrades = grades; /* or pGrades = &grades[0]; */ for( g = 0; g < 4; g++) printf( “%d\n”, pGrades[g]);

/* pGrades can be an alias for grades and be used like a pointer that changes */

for (g = 0; g < 4; g++) printf(“%d\n” *pGrades++);

/* BUT, pGrades can point to something else other than the grades array */ pGrades = &myGrade; printf( “%d\n”, *pGrades); pGrades = &yourGrade; printf( “%d\n”, *pGrades);

Page 20: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

20

More Pointers & Arrays

• If p points to a particular element of an array, then p + 1 points to the next element of the array and p + n points n elements after p

• The meaning a “adding 1 to a pointer” is that p + 1 points to the next element in the array,

REGARDLESS of the type of the array

Page 21: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

21

Pointer Arithmetic• If p is an alias for an array of ints, then p[ k ] is

the k-th int and so is *(p + k).• If p is an alias for an array of doubles, then p[ k ] is the k-th double and so is *(p + k).

• Adding a constant k to a pointer (or array name) actually adds k * sizeof(pointer type) to the value of the pointer.

• This is one important reason why the type of a pointer must be specified when it’s defined.

Page 22: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

22

Passing Arrays• When an array is passed to a function, the address of

the array is copied onto the function parameter. • Since an array address is a pointer, the function

parameter may be declared in either fashion.

• Example: int sumArray( int a[ ], int size)

is equivalent to int sumArray( int *a, int size)

Page 23: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

23

Strings revisited

Recall that a string is represented as an array of characters terminated with a null (\0) character.

As we’ve seen, arrays and pointers are closely related. A string constant may be declared as either

char[ ] or char*as in char hello[ ] = “Hello Bobby”;

or (almost) equivalently char *hi = “Hello Bob”;

Page 24: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

24

Arrays of Pointers

Since a pointer is a variable type, we can create an array of pointers just like we can create any array of any other type.

Although the pointers may point to any type, the most common use of an array of pointers is an array of char* to create an array of strings.

Page 25: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

25

Boy’s NamesA common use of an array of pointers is to create an array

of strings. The declaration below creates an initialized array of strings (char *) for some boys names. The diagram below illustrates the memory configuration.

char *name[] = { “Bobby”, “Jim”, Harold” };

B o b b y \0J i m \0

H a r o l d \0

name:0

1

2

Page 26: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

26

char* array vs. char**Because the name of an array is a synonym for the address of the first

element of the array, the name of the array may be treated like a pointer to the array. As a result, the name of an array of strings (for example) may be defined as either char *[ ] or char**.

For example, the boy’s name array char *name[] = { “Bobby”, “Jim”, Harold” };may also be defined (almost equivalently) as char **name = { “Bobby”, “Jim”, Harold” };

In particular, the parameters for main may be written as either int main (int argc, char *argv[ ])or int main( int argc, char **argv)

Page 27: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Dynamic Memory Allocation

27

Page 28: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Limits of Static Allocation

What if we don’t know how much space we will need ahead of time?

Example:ask user how many numbers to read inread set of numbers in to array (of appropriate size)calculate the average (look at all numbers)calculate the variance (based on the average)

Problem: how big do we make the array??using static allocation, have to make the array as big as

the user might specify (might not be big enough)

Page 29: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Heap in Computer Memory

• The operating system manages unused memory called heap

• It can be dynamically allocated and de-allocated (freed)

29

Page 30: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Dynamic Memory Allocation

Allow the program to allocate some variables (notably arrays), during the program, based on variables in program (dynamically)

Previous example: ask the user how many numbers to read, then allocate array of appropriate size

Idea: user has routines to request some amount of memory, the user then uses this memory, and returns it when they are done

Memory allocated in the Data Heap

Page 31: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Memory Management Functions

calloc - routine used to allocate arrays of memorymalloc - routine used to allocate a single block of

memoryrealloc - routine used to extend the amount of space

allocated previouslyfree - routine used to tell program a piece of memory

no longer needed

Note: memory allocated dynamically does not go away at the end of functions, you MUST explicitly free it up

Page 32: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Array Allocation with calloc

prototype: void * calloc(size_t num, size_t esize)size_t : a special type used to indicate sizes, generally an

unsigned intnum : the number of elements to be allocated in the arrayesize : the size of the elements to be allocated

if not enough memory is available, calloc returns NULL

Page 33: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

calloc Example

float *nums;

int N;

int I;

printf(“Read how many numbers:”);

scanf(“%d”,&N);

nums = (float *) calloc(N, sizeof(float));

/* nums is now an array of floats of size N */

for (I = 0; I < N; I++) {

printf(“Please enter number %d: “,I+1);

scanf(“%f”,&(nums[I]));

}

Page 34: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Releasing Memory (free)

prototype: void free(void *ptr)memory at location pointed to by ptr is released (so we

could use it again in the future)program keeps track of each piece of memory allocated by

where that memory startsif we free a piece of memory allocated with calloc, the entire

array is freed (released)results are problematic if we pass as address to free an

address of something that was not allocated dynamically (or has already been freed)

Page 35: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

free Examplefloat *nums;

int N;

printf(“Read how many numbers:”);

scanf(“%d”,&N);

nums = (float *) calloc(N, sizeof(float));

/* use array nums */

/* when done with nums: */

free(nums);

/* would be an error to say it again - free(nums) */

Page 36: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

The Importance of freevoid problem() { float *nums; int N = 5;

nums = (float *) calloc(N, sizeof(float));

/* But no call to free with nums */} /* problem ends */

When function problem called, space for array of size N allocated, when function ends, variable nums goes away, but the space nums points at (the array of size N) does not (allocated on the heap) - furthermore, we have no way to figure out where it is)

Problem called memory leak

Page 37: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Array Allocation with malloc

prototype: void * malloc(size_t esize)similar to calloc, except we use it to allocate a single block

of the given size esize

as with calloc, memory is allocated from heap

NULL returned if not enough memory available

memory must be released using free once the user is done

Page 38: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Dynamically Allocating 2D Arrays

We can not simply dynamically allocate 2D (or higher) array

Idea - allocate an array of pointers (first dimension), make each pointer point to a 1D array of the appropriate size

Can treat result as 2D arrayUseful for Image Processing

in C/C++ (e.g. OpenCV library)

Page 39: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Dynamically Allocating 2D Array

float **A; /* A is an array (pointer) of float

pointers */

int I;

A = (float **) calloc(5,sizeof(float *));

/* A is a 1D array (size 5) of float pointers */

for (I = 0; I < 5; I++)

A[I] = (float *) calloc(4,sizeof(float));

/* Each element of array points to an array of 4 float variables */

/* A[I][J] is the Jth entry in the array that the Ith member of A points to */

Page 40: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Non-Square 2D Arraysfloat **A;

int I;

A = (float **) calloc(5,

sizeof(float *));

for (I = 0; I < 5; I++)

A[I] = (float **)

calloc(I+1,

sizeof(float));

Page 41: POINTER AND ARRAY - Gadjah Mada Universityte.ugm.ac.id/~wibirama/tke670/week05/05-pointer-array...Pointers A pointer is a reference to another variable (memory location) in a program

Presentasi• Mulai minggu depan (1 April 2011) dengan

tema: Stack

• Presenter : Bp. Riyanto dan Bp. Sapto Nugroho

• Petunjuk : http://te.ugm.ac.id/~wibirama/tke670/week03/Petunjuk_Tugas_Kelompok.doc

41