Pointers! Arizona State University 1

Similar documents
What is an algorithm?

Chapter 9: Pointers. Copyright 2015, 2012, 2009 Pearson Education, Inc., Publishing as Addison-Wesley All rights reserved.

Chapter 9: Getting the Address of a Variable. Something Like Pointers: Arrays. Pointer Variables 8/23/2014. Getting the Address of a Variable

Chapter 9: Pointers Co C pyr py igh i t gh Pear ea so s n n E ducat ca io i n, n Inc. n c.

9.2 Pointer Variables. Pointer Variables CS Pointer Variables. Pointer Variables. 9.1 Getting the Address of a. Variable

calling a function - function-name(argument list); y = square ( z ); include parentheses even if parameter list is empty!

Pointers Pointer Variables. Pointer Variables Getting the Address of a Variable. Each variable in program is stored at a

Homework #3 CS2255 Fall 2012

Pointers and Dynamic Memory Allocation

Pointers. Developed By Ms. K.M.Sanghavi

Pointers. A pointer value is the address of the first byte of the pointed object in the memory. A pointer does not know how many bytes it points to.

Exam 3 Chapters 7 & 9

Pointer Basics. Lecture 13 COP 3014 Spring March 28, 2018

Pointers. 10/5/07 Pointers 1

Lecture 14. No in-class files today. Homework 7 (due on Wednesday) and Project 3 (due in 10 days) posted. Questions?

Pointers, Dynamic Data, and Reference Types

Variation of Pointers

Introduction to Computer Science Midterm 3 Fall, Points

The C++ Language. Arizona State University 1

Pointers. Memory. void foo() { }//return

Arrays. Returning arrays Pointers Dynamic arrays Smart pointers Vectors

CS201 Some Important Definitions

CSE 333 Lecture smart pointers

CSC 211 Intermediate Programming. Arrays & Pointers

CSE 333 Lecture smart pointers

Chapter 10. Pointers and Dynamic Arrays. Copyright 2016 Pearson, Inc. All rights reserved.


Pointers and Arrays CS 201. This slide set covers pointers and arrays in C++. You should read Chapter 8 from your Deitel & Deitel book.

Unit III Virtual Functions. Developed By Ms. K.M.Sanghavi

Modern C++ for Computer Vision and Image Processing. Igor Bogoslavskyi

COMP6771 Advanced C++ Programming

Homework 4. Any questions?

CS2255 HOMEWORK #1 Fall 2012

Pointers. 1 Background. 1.1 Variables and Memory. 1.2 Motivating Pointers Massachusetts Institute of Technology

Ch. 12: Operator Overloading

[0569] p 0318 garbage

Object-Oriented Programming for Scientific Computing

Looping. Arizona State University 1

COMP26120: Pointers in C (2018/19) Lucas Cordeiro

Consider the program...

DYNAMIC ARRAYS; FUNCTIONS & POINTERS; SHALLOW VS DEEP COPY

CS201- Introduction to Programming Current Quizzes

Copy Control 2008/04/08. Programming Research Laboratory Seoul National University

CSE 143. Linked Lists. Linked Lists. Manipulating Nodes (1) Creating Nodes. Manipulating Nodes (3) Manipulating Nodes (2) CSE 143 1

Functions. Arizona State University 1

Object-Oriented Programming for Scientific Computing

INITIALISING POINTER VARIABLES; DYNAMIC VARIABLES; OPERATIONS ON POINTERS

C++ Programming Lecture 7 Software Engineering Group

CSCI 262 Data Structures. Arrays and Pointers. Arrays. Arrays and Pointers 2/6/2018 POINTER ARITHMETIC

C++ (Non for C Programmer) (BT307) 40 Hours

Introducing C++ to Java Programmers

CS201 Latest Solved MCQs

by Pearson Education, Inc. All Rights Reserved.

Make Classes Useful Again

LECTURE 11 STRUCTURED DATA

Arrays. Arizona State University 1

KOM3191 Object Oriented Programming Dr Muharrem Mercimek ARRAYS ~ VECTORS. KOM3191 Object-Oriented Computer Programming

Chapter-11 POINTERS. Important 3 Marks. Introduction: Memory Utilization of Pointer: Pointer:

Lecture 23: Pointer Arithmetic

Smart Pointers. Some slides from Internet

Variables, Memory and Pointers

Dynamic Allocation of Memory

Short Notes of CS201

CHAPTER 1 Introduction to Computers and Programming CHAPTER 2 Introduction to C++ ( Hexadecimal 0xF4 and Octal literals 031) cout Object

C++ Memory Map. A pointer is a variable that holds a memory address, usually the location of another variable in memory.

RAII and Smart Pointers. Ali Malik

CS162 - POINTERS. Lecture: Pointers and Dynamic Memory

CSC 1300 Exam 4 Comprehensive-ish and Structs

Polymorphism. Arizona State University 1

Quiz Start Time: 09:34 PM Time Left 82 sec(s)

CS201 - Introduction to Programming Glossary By

Chapter 1: Object-Oriented Programming Using C++

! Pass by value: when an argument is passed to a. ! It is implemented using variable initialization. ! Changes to the parameter in the function body

Dynamic Memory Allocation

FORM 2 (Please put your name and form # on the scantron!!!!)

Basic memory model Using functions Writing functions. Basics Prototypes Parameters Return types Functions and memory Names and namespaces

KOM3191 Object Oriented Programming Dr Muharrem Mercimek OPERATOR OVERLOADING. KOM3191 Object-Oriented Programming

nptr = new int; // assigns valid address_of_int value to nptr std::cin >> n; // assigns valid int value to n

Chapter 10 Pointers and Dynamic Arrays. GEDB030 Computer Programming for Engineers Fall 2017 Euiseong Seo

! A pointer variable (or pointer): ! An asterisk is used to define a pointer variable. ! ptr is a pointer to an int or

Chapter Overview. Pointers and Dynamic Arrays. Pointers. Pointers. Declaring Pointers. Pointers Tell Where To Find A Variable. 9.

3.Constructors and Destructors. Develop cpp program to implement constructor and destructor.

Object Oriented Software Design II

Programación de Computadores. Cesar Julio Bustacara M. Departamento de Ingeniería de Sistemas Facultad de Ingeniería Pontificia Universidad Javeriana

FORM 1 (Please put your name and section number (001/10am or 002/2pm) on the scantron!!!!) CS 161 Exam II: True (A)/False(B) (2 pts each):

Exceptions, Templates, and the STL

Chapter 11: Structured Data

Lab 2: Pointers. //declare a pointer variable ptr1 pointing to x. //change the value of x to 10 through ptr1

Smart Pointers in C++11

Course Text. Course Description. Course Objectives. StraighterLine Introduction to Programming in C++

Memory Leak. C++: Memory Problems. Memory Leak. Memory Leak. Pointer Ownership. Memory Leak

In Java we have the keyword null, which is the value of an uninitialized reference type

Pointers. Variable Declaration. Chapter 10

Chapter 9. Pointers and Dynamic Arrays

C:\Temp\Templates. Download This PDF From The Web Site

a data type is Types

Chapter 11: Structured Data

Fast Introduction to Object Oriented Programming and C++

CSCI-1200 Data Structures Fall 2017 Lecture 5 Pointers, Arrays, & Pointer Arithmetic

Chapter 11: Abstract Data Types. Abstraction and Data Types. Combining Data into Structures 8/23/2014. Abstract Data Types

Transcription:

Pointers! CSE100 Principles of Programming with C++, Fall 2018 (based off Chapter 10 slides by Pearson) Ryan Dougherty Arizona State University http://www.public.asu.edu/~redoughe/ Arizona State University 1

Pointers + Address Operator Each variable in a program is stored at a unique location in memory that has an address Use the address operator & to get the address of a variable: int num = -23; cout << &num; // prints address // in hexadecimal The address of a memory location is a pointer Pointer variable (pointer): a variable that holds an address Pointers provide an alternate way to access memory locations Arizona State University 2

Pointer Variables Definition: int *intptr; Read as: intptr can hold the address of an int or the variable that intptr points to has type int The spacing in the definition does not matter: int * intptr; int* intptr; * is called the indirection operator (also dereference operator) Arizona State University 3

Pointer Variables (cont.) Definition and assignment: int num = 25; int *intptr; intptr = &num; Memory layout: num intptr 25 0x4a00 address of num: 0x4a00 You can access num using intptr and indirection operator *: cout << intptr; // prints 0x4a00 cout << *intptr; // prints 25 *intptr = 20; // puts 20 in num Arizona State University 4

Relationship between Arrays and Pointers An array name is the starting address of the array int vals[] = {4, 7, 11}; cout << vals; 4 7 11 // displays 0x4a00 cout << vals[0]; // displays 4 An array name can be used as a pointer constant int vals[] = {4, 7, 11}; cout << *vals; // displays 4 A pointer can be used as an array name int *valptr = vals; cout << valptr[1]; // displays 7 starting address of vals: 0x4a00 Arizona State University 5

Pointers in Expressions Given: int vals[]={4,7,11}; int *valptr = vals; What is valptr + 1? It means (address in valptr) + (1 * size of an int) cout << *(valptr+1); // displays 7 cout << *(valptr+2); // displays 11 Must use ( ) in expression Arizona State University 6

Array Access Array elements can be accessed in many ways Array access method Example array name and [ ] vals[2] = 17; pointer to array and [ ] valptr[2] = 17; array name and subscript arithmetic pointer to array and subscript arithmetic *(vals+2) = 17; *(valptr+2) = 17; Arizona State University 7

Array Access (cont.) Array notation vals[i] is equivalent to the pointer notation *(vals + i) Remember that no bounds checking is performed on array access Arizona State University 8

Pointer Arithmetic Some arithmetic operators can be used with pointers: Increment and decrement operators ++, -- Integers can be added to or subtracted from pointers using the operators +, -, +=, and -= One pointer can be subtracted from another by using the subtraction operator - Assume the variable definitions int vals[]={4,7,11}; int *valptr = vals; Examples of use of ++ and -- valptr++; // points at 7 valptr--; // now points at 4 Arizona State University 9

Pointer Arithmetic (cont.) Assume the variable definitions: int vals[]={4,7,11}; int *valptr = vals; Example of the use of + to add an int to a pointer: cout << *(valptr + 2) This statement will print 11 Arizona State University 10

Pointer Arithmetic (cont.) Assume the variable definitions: int vals[]={4,7,11}; int *valptr = vals; Example of use of +=: valptr = vals; // points at 4 valptr += 2; // points at 11 Arizona State University 11

Pointer Arithmetic (cont.) Assume the variable definitions int vals[] = {4,7,11}; int *valptr = vals; Example of pointer subtraction valptr += 2; cout << valptr - val; This statement prints 2: the number of ints between valptr and val Arizona State University 12

Initializing Pointers (the WRONG way) You can initialize to NULL or 0 (zero) int *ptr = NULL; You can initialize to addresses of other variables int num, *numptr = &num; int val[isize], *valptr = val; The initial value must have the correct type float cost; int *ptr = &cost; // won't work Arizona State University 13

Initializing Pointers (the RIGHT way) In C++ 11, putting empty { } after a variable definition indicates that the variable should be initialized to its default value C++ 11 also has the the key word nullptr to indicate that a pointer variable does not contain a valid memory location You can use int *ptr = nullptr; or int *ptr{ }; Arizona State University 14

Comparing Pointers Relational operators can be used to compare the addresses in pointers Comparing addresses in pointers is not the same as comparing contents pointed at by pointers: if (ptr1 == ptr2) // compares // addresses if (*ptr1 == *ptr2) // compares // contents Arizona State University 15

Pointers as Function Parameters A pointer can be a parameter It works like a reference parameter to allow changes to argument from within a function A pointer parameter must be explicitly dereferenced to access the contents at that address Arizona State University 16

Pointers as Function Parameters (cont.) Requires: 1) asterisk * on parameter in prototype and header void getnum(int *ptr); 2) asterisk * in body to dereference the pointer cin >> *ptr; 3) address as argument to the function in the call getnum(&num); Arizona State University 17

Pointers as Function Parameters (cont.) void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } int num1 = 2, num2 = -3; swap(&num1, &num2); //call Arizona State University 18

Passing Arrays as Pointers A pointer parameter receives an address when a function is called The address could be for a single variable, or it could be the address of the first element of an array. You can use either subscript notation or pointer arithmetic to access the elements of the array. Arizona State University 19

Constant? Pointers A pointer to a constant: you cannot change the value that is pointed at A constant pointer: the address in the pointer cannot be changed after the pointer is initialized Must use the const keyword in the pointer definition: const double taxrates[] = {0.65, 0.8, 0.75}; const double *rateptr; Use the const keyword for pointer parameters in function headers to protect data from modification in the function, as well as to pass addresses of const arguments Arizona State University 20

Pointer to Constant Arizona State University 21

Constant Pointers A constant pointer is a pointer whose data (the address in the pointer) cannot change It is defined with the const keyword adjacent to the variable name: int classsize = 24; int * const classptr = &classsize; It must be initialized when defined No initialization needed if used as a function parameter Initialized by the argument when function is called Function can receive different arguments on different calls While the address in the pointer cannot change, the data at that address may be changed Arizona State University 22

Constant Pointer Arizona State University 23

Constant Pointer to Constant You can combine pointers to constants and constant pointers: int size = 10; const int * const ptr = &size; What does it mean? Arizona State University 24

Dynamic Memory Allocation ( wrong way) You can allocate storage for a variable while a program is running Use the new operator to allocate memory double *dptr; dptr = new double; new returns address of a memory location The data type of the variable is indicated after new You can also use new to allocate an array arrayptr = new double[25]; The program may terminate if there is not sufficient memory You can then use [ ] or pointer arithmetic to access array Arizona State University 25

Dynamic Memory Example int *count, *arrayptr; count = new int; cout <<"How many students? "; cin >> *count; arrayptr = new int[*count]; for (int i=0; i<*count; i++) { cout << "Enter score " << i << ": "; cin >> arrayptr[i]; } Arizona State University 26

Releasing Dynamic Memory Use delete to free dynamic memory delete count; Use delete [] to free dynamic array memory delete [] arrayptr; Only use delete with dynamic memory! Arizona State University 27

Dangling Pointers A pointer is dangling if it contains the address of memory that has been freed by a call to delete. Solution: set such pointers to NULL (or nullptr in C++ 11) as soon as the memory is freed. A memory leak occurs if no-longer-needed dynamic memory is not freed. The memory is unavailable for reuse within the program. Solution: free up dynamic memory after use Arizona State University 28

Returning Pointers A pointer can be the return type of function int* newnum(); The function must not return a pointer to a local variable in the function The function should only return a pointer to data that was passed to the function as an argument to dynamically allocated memory Arizona State University 29

More on Memory Leaks General guidelines to avoid memory leaks: If a function allocates memory via new, it should, whenever possible, also deallocate the memory using delete If a class needs dynamic memory, it should allocate it using new in the constructor deallocate it using delete in the destructor Arizona State University 30

Pointers to Class Objects You can create pointers to objects and structure variables struct Student { }; class Square { }; Student stu1; Student *stuptr = &stu1; Square sq1[4]; Square *squareptr = &sq1[0]; You need to use() when using * and. operators (*stuptr).studentid = 12204; Arizona State University 31

Pointer Operator for Objects Simpler notation than (*ptr).member Use the form ptr->member stuptr->studentid = 12204; squareptr->setside(14); in place of the form (*ptr).member (*stuptr).studentid = 12204; (*squareptr).setside(14); Arizona State University 32

Dynamic Memory for Objects You can allocate dynamic structure variables and objects using pointers: stuptr = new Student; You can pass values to the object s constructor: squareptr = new Square(17); delete causes destructor to be invoked: delete squareptr; Arizona State University 33

Selecting Members of Objects Situation: A structure/object contains a pointer as a member. There is also a pointer to the structure/ object. Problem: How do we access the pointer member via the structure/object pointer? struct GradeList { string coursenum; int * grades; } GradeList test1, *testptr = &test1; Arizona State University 34

Selecting Members of Objects Expression testptr->grades *testptr->grades *test1.grades Meaning Access the grades pointer in test1. This is the same as (*testptr).grades Access the value pointed at by testptr- >grades. This is the same as *(*testptr).grades Access the value pointed at by test1.grades Arizona State University 35

Smart Pointers Introduced in C++ 11 They can be used to solve the following problems in a large software project dangling pointers pointers whose memory is deleted while the pointer is still being used memory leaks allocated memory that is no longer needed but is not deleted double-deletion two different pointers de-allocating the same memory Arizona State University 36

Smart Pointers (cont.) Smart pointers are objects that work like pointers. Unlike regular (raw) pointers, smart pointers can automatically delete dynamic memory that is no longer being used. There are three types of smart pointers: unique pointers (unique_ptr) shared pointers (shared_ptr) weak pointers (weak_ptr) Arizona State University 37

Unique Pointers A smart pointer owns (or manages) the object that it points to. A unique pointer points to a dynamically allocated object that has a single owner. Ownership can be transferred to another unique pointer. Memory for the object is deallocated when the owning unique pointer goes out of scope, or if it takes ownership of a different object. Arizona State University 38

Unique Pointer Examples Requires the <memory> header file Create a unique pointer that points to an int (the wrong way): unique_ptr<int> uptr(new int); Assign the value 5 to it and print it: *uptr = 5; cout << *uptr; Transfer ownership to unique pointer ptr2: unique_ptr<int> uptr2; uptr2 = move(uptr); Arizona State University 39

Creating a Unique Pointer (the RIGHT way) In C++14, a new function called make_unique was created: auto uptr = make_unique<int>(); Why is this better than the previous example? Arizona State University 40

Unique Pointer Ownership Transfer In a statement such as: uptr2 = move(uptr); Any object owned by uptr2 is deallocated uptr2 takes ownership of the object previously owned by uptr uptr becomes empty Arizona State University 41

move() The move() function is required on the argument when passing a unique pointer by value. The move() function is not required for pass by reference A unique pointer can be returned from a function, as the compiler automatically uses move() in this case. Arizona State University 42

Clearing (Manually) a Unique Pointer Unique pointers deallocate the memory for their objects when they go out of scope. To manually deallocate memory, use uptr = nullptr; or uptr.reset(); Arizona State University 43

Unique Pointers + Arrays Use array notation when using an unique pointer to allocate memory for an array unique_ptr<int[]> uptr3(new int[5]); Doing so ensures that the proper deallocation (delete[] instead of delete) will be used. Arizona State University 44

Shared Pointers A smart pointer owns (or manages) the object that it points to. A shared pointer points to a dynamically allocated object that may have multiple owners. A control block manages the reference count of the number of shared owners and also possibly the raw pointer if one exists. Arizona State University 45

Creating Shared Pointers Create a shared pointer to point to an existing dynamic object declared with a raw pointer (again, the wrong way): int * rawptr = new int; shared_ptr<int> uptr4(rawptr); Create a second shared pointer initialized to the same object: shared_ptr<int>uptr5 = uptr4; rawptr, uptr4, and uptr5 are all tracked in the control block. The function make_shared helps with this, like make_unique did (although available since C++11 here). Arizona State University 46

How many control blocks? Be careful that all references to a dynamic object are tracked in the same control block In the code below: int * rawptr = new int; shared_ptr<int> uptr4(rawptr); shared_ptr<int> uptr5(rawptr); Two control blocks are created. This can cause a dangling pointer. Arizona State University 47

Memory Management Tip Creating a shared pointer involves memory for the object and memory for the control block. These memory allocations can be combined by using the make_shared function: shared_ptr<int> uptr6 = make_shared<int>(); You can also pass parameters to a constructor using an overloaded version of make_shared. Arizona State University 48