Pointers and dynamic objects COMP171 Fall 2006. Pointers and dynamic objects/ Slide 2 Topics * Pointers n Memory addresses n Declaration n Dereferencing.

Slides:



Advertisements
Similar presentations
Pointer applications. Arrays and pointers Name of an array is a pointer constant to the first element whose value cannot be changed Address and name refer.
Advertisements

Kernighan/Ritchie: Kelley/Pohl:
Engineering Problem Solving With C++ An Object Based Approach Chapter 9 Pointers and Creating Data Structures.
1 Pointers A pointer variable holds an address We may add or subtract an integer to get a different address. Adding an integer k to a pointer p with base.
Chapter 9. 2 Objectives You should be able to describe: Addresses and Pointers Array Names as Pointers Pointer Arithmetic Passing Addresses Common Programming.
Dynamic Objects. COMP104 Dynamic Objects / Slide 2 Memory Management * Static Memory Allocation n Memory is allocated at compiling time * Dynamic Memory.
This set of notes is adapted from that provided by “Computer Science – A Structured Programming Approach Using C++”, B.A. Forouzan & R.F. Gilberg, Thomson.
Dynamic Objects. COMP104 Lecture 31 / Slide 2 Static verses Dynamic Objects * Static object n Memory is acquired automatically  int A[10]; n Memory is.
Dynamic Objects. COMP104 Dynamic Objects / Slide 2 Memory Management * Static Memory Allocation n Memory is allocated at compilation time * Dynamic Memory.
J. P. Cohoon and J. W. Davidson © 1999 McGraw-Hill, Inc. Pointers and Dynamic Objects Mechanisms for developing flexible list representations.
Review of pointers and dynamic objects. Memory Management  Static Memory Allocation  Memory is allocated at compiling time  Dynamic Memory  Memory.
Pointers. Topics Pointers Pointer Arithmetic Pointers and Arrays.
Pointers. COMP104 Pointers / Slide 2 Pointers * A pointer is a variable used for storing the address of a memory cell. * We can use the pointer to reference.
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 9 Pointers and Dynamic Arrays.
Pointers: Part I. Why pointers? - low-level, but efficient manipulation of memory - dynamic objects  Objects whose memory is allocated during program.
ARRAYS AND POINTERS Although pointer types are not integer types, some integer arithmetic operators can be applied to pointers. The affect of this arithmetic.
Review on pointers and dynamic objects. Memory Management  Static Memory Allocation  Memory is allocated at compiling time  Dynamic Memory  Memory.
1 Pointers, Dynamic Data, and Reference Types Review on Pointers Reference Variables Dynamic Memory Allocation –The new operator –The delete operator –Dynamic.
1 Chapter 9 Pointers. 2 Topics 8.1 Getting the Address of a Variable 8.2 Pointer Variables 8.3 Relationship Between Arrays and Pointers 8.4 Pointer Arithmetic.
Programming Pointers. COMP104 Lecture 32 / Slide 2 Pointers l Pointers are objects whose values are the locations of other objects l Pointers are memory.
HKUST Summer Programming Course 2008
Pointers. Why pointers? - low-level, but efficient manipulation of memory - dynamic objects  Objects whose memory is allocated during program execution.
1 Procedural Concept The main program coordinates calls to procedures and hands over appropriate data as parameters.
Prof. amr Goneid, AUC1 CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++ Prof. Amr Goneid AUC Part 10. Pointers & Dynamic Data Structures.
This set of notes is adapted from that provided by “Computer Science – A Structured Programming Approach Using C++”, B.A. Forouzan & R.F. Gilberg, Thomson.
Chapter 5 – Dynamic Data Structure Par1: Abstract Data Type DATA STRUCTURES & ALGORITHMS Teacher: Nguyen Do Thai Nguyen
Computer Science and Software Engineering University of Wisconsin - Platteville 2. Pointer Yan Shi CS/SE2630 Lecture Notes.
Pointers and Dynamic Objects Mechanisms for developing flexible list representations JPC and JWD © 2002 McGraw-Hill, Inc.
1 Pointers Arrays have a disadvantage: Their size must be known at compile time. We would like the capability to allocate an array-like object of any needed.
Pointers OVERVIEW.
Pointers, Variables, and Memory. Variables and Pointers When you declare a variable, memory is allocated to store a value. A pointer can be used to hold.
Pointers and Dynamic Memory Allocation Copyright Kip Irvine 2003, all rights reserved. Revised 10/28/2003.
Pointers in C++. 7a-2 Pointers "pointer" is a basic type like int or double value of a pointer variable contains the location, or address in memory, of.
C Programming Day 4. 2 Copyright © 2005, Infosys Technologies Ltd ER/CORP/CRS/LA07/003 Version No. 1.0 More on Pointers Constant Pointers Two ways to.
Dynamic Allocation Joe Meehean. Dynamic Allocation Memory for local objects is automatically created and reclaimed memory is created for it at beginning.
Pointers. What is pointer l Everything stored in a computer program has a memory address. This is especially true of variables. char c=‘y’; int i=2; According.
Copyright 2005, The Ohio State University 1 Pointers, Dynamic Data, and Reference Types Review on Pointers Reference Variables Dynamic Memory Allocation.
POINTERS.
Review 1 List Data Structure List operations List Implementation Array Linked List.
ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation.
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
CS415 C++ Programming Takamitsu Kawai x4212 G11 CERC building WV Virtual Environments Lab West Virginia University.
Pointers It provides a way of accessing a variable without referring to its name. The mechanism used for this is the address of the variable.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 9 Pointers and Dynamic Arrays.
Copyright © 2014 Pearson Addison-Wesley. All rights reserved. Chapter 9 Pointers and Dynamic Arrays.
1 Chapter 15-1 Pointers, Dynamic Data, and Reference Types Dale/Weems.
ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation.
© M. Gross, ETH Zürich, 2014 Informatik I für D-MAVT (FS 2014) Exercise 7 – Pointers.
Dr. Yang, QingXiong (with slides borrowed from Dr. Yuen, Joe) LT:10 Advance Pointer Array, String and Dynamic Memory Allocation CS2311 Computer Programming.
CS162 - Topic #12 Lecture: –Arrays with Structured Elements defining and using arrays of arrays remember pointer arithmetic Programming Project –Any questions?
Computer Programming Basics Assistant Professor Jeon, Seokhee Assistant Professor Department of Computer Engineering, Kyung Hee University, Korea.
A FIRST BOOK OF C++ CHAPTER 8 ARRAYS AND POINTERS.
CSC Pointers Powerful feature of the C++ language One of the most difficult to master Essential for construction of interesting data structures.
Arrays An array is a sequence of objects all of which have the same type. The objects are called the elements of the array and are numbered consecutively.
Pointers CSC1201: Programming Language 2. Topics Pointers ▫Memory addresses ▫Declaration ▫Dereferencing a pointer ▫Pointers to pointer.
Topic 5 Addresses, Pointers and Arrays. 2 Objectives (Textbook Chapter 14) You should be able to describe: Addresses and Pointers Pointer Operators Pointer.
Pointers and Dynamic Arrays
Computer Organization and Design Pointers, Arrays and Strings in C
Stack Lesson xx   This module shows you the basic elements of a type of linked list called a stack.
Dynamic Memory Allocation Reference Variables
Dynamic Memory Allocation
Pointers and dynamic objects
Pointers, Dynamic Data, and Reference Types
Programming II Pointers and arrays by aalosaimi.
Pointers.
Dynamic Objects.
Pointers and dynamic objects
Pointers and dynamic objects
Pointers, Dynamic Data, and Reference Types
Dynamic Objects.
Presentation transcript:

Pointers and dynamic objects COMP171 Fall 2006

Pointers and dynamic objects/ Slide 2 Topics * Pointers n Memory addresses n Declaration n Dereferencing a pointer n Pointers to pointer * Static vs. dynamic objects new and delete

Pointers and dynamic objects/ Slide 3 Computer Memory * Each variable is assigned a memory slot (the size depends on the data type) and the variable’s data is stored there Variable a’s value, i.e., 100, is stored at memory location ……1024… Memory address: int a = 100; … 1020 a

Pointers and dynamic objects/ Slide 4 Pointers * A pointer is a variable used to store the address of a memory cell. * We can use the pointer to reference this memory cell 100……1024… Memory address: … 1020 integer pointer

Pointers and dynamic objects/ Slide 5 Pointer Types * Pointer n C++ has pointer types for each type of object  Pointers to int objects  Pointers to char objects  Pointers to user-defined objects (e.g., RationalNumber ) n Even pointers to pointers  Pointers to pointers to int objects

Pointers and dynamic objects/ Slide 6 Pointer Variable * Declaration of Pointer variables type* pointer_name; //or type *pointer_name; where type is the type of data pointed to (e.g. int, char, double) Examples: int *n; RationalNumber *r; int **p; // pointer to pointer

Pointers and dynamic objects/ Slide 7 Address Operator &  The " address of " operator ( & ) gives the memory address of the variable Usage: &variable_name 100………… Memory address:1024 int a = 100; //get the value, cout << a; //prints 100 //get the memory address cout << &a; //prints 1024 … 1020 a

Pointers and dynamic objects/ Slide 8 Address Operator & 10088……… Memory address: a … 1020 b #include using namespace std; void main(){ int a, b; a = 88; b = 100; cout << "The address of a is: " << &a << endl; cout << "The address of b is: " << &b << endl; } l Result is: The address of a is: 1020 The address of b is: 1024

Pointers and dynamic objects/ Slide 9  The value of pointer p is the address of variable a * A pointer is also a variable, so it has its own memory address Pointer Variables 10088…1024… Memory address: … 1020 ap int a = 100; int *p = &a; cout << a << " " << &a <<endl; cout << p << " " << &p <<endl; l Result is:

Pointers and dynamic objects/ Slide 10 Pointer to Pointer What is the output?

Pointers and dynamic objects/ Slide 11 Dereferencing Operator *  We can access to the value stored in the variable pointed to by using the dereferencing operator (*), 10088…1024… Memory address: … 1020 int a = 100; int *p = &a; cout << a << endl; cout << &a << endl; cout << p << " " << *p << endl; cout << &p << endl; l Result is: ap

Pointers and dynamic objects/ Slide 12 Don’t get confused  Declaring a pointer means only that it is a pointer: int *p;  Don’t be confused with the dereferencing operator, which is also written with an asterisk (*). They are simply two different tasks represented with the same sign int a = 100, b = 88, c = 8; int *p1 = &a, *p2, *p3 = &c; p2 = &b;// p2 points to b p2 = p1; // p2 points to a b = *p3;//assign c to b *p2 = *p3;//assign c to a cout << a << b << c; l Result is: 888

Pointers and dynamic objects/ Slide 13 A Pointer Example The code void doubleIt(int x, int * p) { *p = 2 * x; } int main(int argc, const char * argv[]) { int a = 16; doubleIt(9, &a); return 0; } Box diagram Memory Layout 9 x p (8200) x (8196) 16 a main doubleIt p a (8192) main doubleIt a gets 18

Pointers and dynamic objects/ Slide 14 Another Pointer Example #include using namespace std; int main (){ int value1 = 5, value2 = 15; int *p1, *p2; p1 = &value1; // p1 = address of value1 p2 = &value2; // p2 = address of value2 *p1 = 10; // value pointed to by p1=10 *p2 = *p1; // value pointed to by p2= value // pointed to by p1 p1 = p2; // p1 = p2 (pointer value copied) *p1 = 20; // value pointed to by p1 = 20 cout << "value1==" << value1 << "/ value2==" << value2; return 0; } l Let’s figure out: value1==? / value2==? Also, p1=? p2=?

Pointers and dynamic objects/ Slide 15 Another Pointer Example int a = 3; char s = ‘z’; double d = 1.03; int *pa = &a; char *ps = &s; double *pd = &d; % sizeof returns the # of bytes… cout << sizeof(pa) << sizeof(*pa) << sizeof(&pa) << endl; cout << sizeof(ps) << sizeof(*ps) << sizeof(&ps) << endl; cout << sizeof(pd) << sizeof(*pd) << sizeof(&pd) << endl;

Pointers and dynamic objects/ Slide 16 Reference Variables A reference is an additional name to an existing memory location 9 x ref Pointer: 9 x ref Reference: int x=9; int *ref; ref = &x; int x = 9; int &ref = x;

Pointers and dynamic objects/ Slide 17 Reference Variables * A reference variable serves as an alternative name for an object int m = 10; int &j = m; // j is a reference variable cout << “value of m = “ << m << endl; //print 10 j = 18; cout << “value of m = “ << m << endl; // print 18

Pointers and dynamic objects/ Slide 18 Reference Variables * A reference variable always refers to the same object. Assigning a reference variable with a new value actually changes the value of the referred object. * Reference variables are commonly used for parameter passing to a function

Pointers and dynamic objects/ Slide 19 Traditional Pointer Usage void IndirectSwap(char *Ptr1, char *Ptr2){ char temp = *Ptr1; *Ptr1 = *Ptr2; *Ptr2 = temp; } int main() { char a = 'y'; char b = 'n'; IndirectSwap(&a, &b); cout << a << b << endl; return 0; }

Pointers and dynamic objects/ Slide 20 Pass by Reference void IndirectSwap(char& y, char& z) { char temp = y; y = z; z = temp; } int main() { char a = 'y'; char b = 'n'; IndirectSwap(a, b); cout << a << b << endl; return 0; }

Pointers and dynamic objects/ Slide 21 Pointers and Arrays * The name of an array points only to the first element not the whole array

Pointers and dynamic objects/ Slide 22 Array Name is a pointer constant #include using namespace std; void main (){ int a[5]; cout << "Address of a[0]: " << &a[0] << endl << "Name as pointer: " << a << endl; } Result : Address of a[0]: 0x0065FDE4 Name as pointer: 0x0065FDE4

Pointers and dynamic objects/ Slide 23 Dereferencing An Array Name #include using namespace std; void main(){ int a[5] = {2,4,6,8,22}; cout << *a << " " << a[0]; } //main a[4] a[0] a[2] a[1] a[3] a a This element is called a[0] or *a

Pointers and dynamic objects/ Slide 24 Array Names as Pointers * To access an array, any pointer to the first element can be used instead of the name of the array. We could replace *p by *a 2 #include using namespace std; void main(){ int a[5] = {2,4,6,8,22}; int *p = a; cout << a[0] << " " << *p; } a[4] a[0] a[2] a[1] a[3] a p a

Pointers and dynamic objects/ Slide 25 Multiple Array Pointers  Both a and p are pointers to the same array. 2 4 #include using namespace std; void main(){ int a[5] = {2,4,6,8,22}; int *p = &a[1]; cout << a[0] << " " << p[-1]; cout << a[1] << " " << p[0]; } a[4] a[0] a[2] a[1] a[3] p p[0] a[0]

Pointers and dynamic objects/ Slide 26 Pointer Arithmetic  Given a pointer p, p+n refers to the element that is offset from p by n positions a a + 2 a + 4 a + 3 a + 1 p p + 2 p + 3 p - 1 p + 1

Pointers and dynamic objects/ Slide 27 *(a+n) is identical to a[n] Dereferencing Array Pointers a a + 2 a + 4 a + 3 a + 1 a[3] or *(a + 3) a[2] or *(a + 2) a[1] or *(a + 1) a[0] or *(a + 0) a[4] or *(a + 4) l Note: flexible pointer syntax

Pointers and dynamic objects/ Slide 28 Array of Pointers & Pointers to Array a b c An array of Pointers p int a = 1, b = 2, c = 3; int *p[5]; p[0] = &a; p[1] = &b; p[2] = &c; int list[5] = {9, 8, 7, 6, 5}; int *p; P = list;//points to 1 st entry P = &list[0];//points to 1 st entry P = &list[1];//points to 2 nd entry P = list + 1; //points to 2 nd entry A pointer to an array

Pointers and dynamic objects/ Slide 29 NULL pointer * NULL is a special value that indicates an empty pointer * If you try to access a NULL pointer, you will get an error int *p; p = 0; cout << p << endl; //prints 0 cout << &p << endl;//prints address of p cout << *p << endl;//Error!

Pointers and dynamic objects/ Slide 30 Storing 2D Array in 1D Array int twod[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; int oned[12]; for(int i=0; i<3; i++){ for(int j=0; j<4 ; j++) oned[i*4+j] = twod[i][j]; }

Pointers and dynamic objects/ Slide 31 Pointer to 2-Dimensional Arrays table[ 0] or *( table + 0 ) table table[ 1] or *( table + 1 ) table + 1 table[ 2] or *( table + 2 ) table + 2 int table[3][4] = {{1,2,3,4}, {5,6,7,8},{9,10,11,12}}; for(int i=0; i<3; i++){ for(int j=0; j<4; j++) cout << *(*(table+i)+j); cout << endl; } *(table[i]+j) = table[i][j] What is **table ? table[i] = &table[i][0] refers to the address of the ith row

Dynamic Objects

Pointers and dynamic objects/ Slide 33 Memory Management * Static Memory Allocation n Memory is allocated at compilation time * Dynamic Memory n Memory is allocated at running time

Pointers and dynamic objects/ Slide 34 Static vs. Dynamic Objects * Static object (variables as declared in function calls) n Memory is acquired automatically n Memory is returned automatically when object goes out of scope * Dynamic object n Memory is acquired by program with an allocation request  new operation n Dynamic objects can exist beyond the function in which they were allocated n Object memory is returned by a deallocation request  delete operation

Pointers and dynamic objects/ Slide 35 Memory Allocation { int a[200]; … } int* ptr; ptr = new int[200]; … delete [] ptr; new delete

Pointers and dynamic objects/ Slide 36 Object (variable) creation: New Syntax ptr = new SomeType; where ptr is a pointer of type SomeType p Uninitialized int variable Example int* p = new int;

Pointers and dynamic objects/ Slide 37 Object (variable) destruction: Delete Syntax delete p; storage pointed to by p is returned to free store and p is now undefined p Example int* p = new int; *p = 10; delete p; 10

Pointers and dynamic objects/ Slide 38 Array of New: dynamic arrays  Syntax P = new SomeType[Expression]; n Where  P is a pointer of type SomeType  Expression is the number of objects to be constructed -- we are making an array  Because of the flexible pointer syntax, P can be considered to be an array

Pointers and dynamic objects/ Slide 39 Example Dynamic Memory Allocation Request for “ unnamed ” memory from the Operating System n int *p, n=10; p = new int; p = new int[100]; p new p p = new int[n]; p new

Pointers and dynamic objects/ Slide 40 Memory Allocation Example Want an array of unknown size #include using namespace std; void main() { int n; cout << “How many students? “; cin >> n; int *grades = new int[n]; for(int i=0; i < n; i++){ int mark; cout << “Input Grade for Student” << (i+1) << “ ? :”; cin >> mark; grades[i] = mark; }... printMean( grades, n ); // call a function with dynamic array... }

Pointers and dynamic objects/ Slide 41 Freeing (or deleting) Memory

Pointers and dynamic objects/ Slide 42 A Simple Dynamic List Example cout << "Enter list size: "; int n; cin >> n; int *A = new int[n]; if(n<=0){ cout << "bad size" << endl; return 0; } initialize(A, n, 0); // initialize the array A with value 0 print(A, n); A = addElement(A,n,5); //add an element of value 5 at the end of A print(A, n); A = deleteFirst(A,n); // delete the first element from A print(A, n); selectionSort(A, n); // sort the array (not shown) print(A, n); delete [] A;

Pointers and dynamic objects/ Slide 43 Initialize void initialize(int list[], int size, int value){ for(int i=0; i<size; i++) list[i] = value; }

Pointers and dynamic objects/ Slide 44 print() void print(int list[], int size) { cout << "[ "; for(int i=0; i<size; i++) cout << list[i] << " "; cout << "]" << endl; } l Remember in C++, array parameters are always passed by reference. That is, void print(int list[], int size) {…} is the same as void print(int * list, int size) {…} Note: no & used here, so, the pointer itself is passed by value

Pointers and dynamic objects/ Slide 45 Adding Elements // for adding a new element to end of array int* addElement(int list[], int& size, int value){ int* newList = new int [size+1]; // make new array if(newList==0){ cout << "Memory allocation error for addElement!" << endl; exit(-1); } for(int i=0; i<size; i++) newList[i] = list[i]; if(size) delete [] list; newList[size] = value; size++; return newList; }

Pointers and dynamic objects/ Slide 46 Delete the first element // for deleting the first element of the array int* deleteFirst(int list[], int& size){ if(size <= 1){ if( size) delete list; size = 0; return NULL; } int* newList = new int [size-1]; // make new array if(newList==0){ cout << "Memory allocation error for deleteFirst!" << endl; exit(-1); } for(int i=0; i<size-1; i++)// copy and delete old array newList[i] = list[i+1]; delete [] list; size--; return newList; }

Pointers and dynamic objects/ Slide 47 Adding Element (version 2) // for adding a new element to end of array // here “list” is a reference to a pointer variable: if the value of the pointer is changed in function, the change is global. void addElement( int * & list, int & size, const int value ){ int * newList = new int [size + 1]; if( newList == NULL ){ cout << "Memory allocation error for addElement!" << endl; exit(-1); } for( int i = 0; i < size; i++ ) newList[ i ] = list[ i ]; if( size ) delete [] list; newList[ size ] = value; size++; list = newList; return; }

Pointers and dynamic objects/ Slide 48 Deleting Element (version 2) void deleteFirst( int * & list, int & size ){ if( size <= 1 ){ if( size ) delete list; list = NULL; size = 0; return; } delete list; // delete the first element list++; size--; return; }

Pointers and dynamic objects/ Slide 49 Another Main program int main(){ int * A = NULL; int size = 0; int i; for( i = 0; i < 10; i++ ) addElement( A, size, i ); for( i = 0; i < 10; i++ ) cout << A[i] << " "; cout << endl; for( i = 0; i < 4; i++ ) deleteFirst( A, size ); for( i = 0; i < 6; i++ ) cout << A[i] << " "; cout << endl; return 0; }

Pointers and dynamic objects/ Slide 50 Dangling Pointer Problem int *A = new int[5]; for(int i=0; i<5; i++) A[i] = i; int *B = A; delete [] A; B[0] = 1; // illegal!

Pointers and dynamic objects/ Slide 51 Memory Leak Problem int *A = new int [5]; for(int i=0; i<5; i++) A[i] = i; A = new int [5]; A

Pointers and dynamic objects/ Slide 52 A Dynamic 2D Array * A dynamic array is an array of pointers to save space when not all rows of the array are full. * int **table; table = new int*[6]; … table[0] = new int[4]; table[1] = new int[7]; table[2] = new int[1]; table[3] = new int[3]; table[4] = new int[2]; table[5] = NULL; table[0] table[1] table[2] table[3] table[4] table[5] table

Pointers and dynamic objects/ Slide 53 Memory Allocation int **table; table = new int*[6]; table[0]= new int[3]; table[1]= new int[1]; table[2]= new int[5]; table[3]= new int[10]; table[4]= new int[2]; table[5]= new int[6]; table[0][0] = 1; table[0][1] = 2; table[0][2] = 3; table[1][0] = 4; table[2][0] = 5; table[2][1] = 6; table[2][2] = 7; table[2][3] = 8; table[2][4] = 9; table[4][0] = 10; table[4][1] = 11; cout << table[2][5] << endl;

Pointers and dynamic objects/ Slide 54 Memory Deallocation * Memory leak is a serious bug! * Each row must be deleted individually  Be careful to delete each row before deleting the table pointer. n for(int i=0; i<6; i++) delete [ ] table[i]; delete [ ] table;

Pointers and dynamic objects/ Slide 55 int m, n; cin >> m >> n >> endl; int** mat; mat = new int*[m]; for (int i=0;i<m;i++) mat[i] = new int[n]; Create a matrix of any dimensions, m by n: int m, n; cin >> m >> n >> endl; int** mat; mat = imatrix(m,n); … int** imatrix(nr, nc) { int** m; m = new int*[nr]; for (int i=0;i<nr;i++) m[i] = new int[nc]; return m; } Put it into a function: