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

Similar documents
CSCI-1200 Data Structures Spring 2014 Lecture 5 Pointers, Arrays, Pointer Arithmetic

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

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

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

CSCI-1200 Data Structures Spring 2018 Lecture 5 Pointers, Arrays, & Pointer Arithmetic

CSCI-1200 Data Structures Fall 2017 Lecture 7 Order Notation & Basic Recursion

CSCI-1200 Data Structures Fall 2015 Lecture 6 Pointers & Dynamic Memory

CSCI-1200 Data Structures Fall 2009 Lecture 25 Concurrency & Asynchronous Computing

CSCI-1200 Data Structures Fall 2013 Lecture 9 Iterators & Lists

CSCI-1200 Data Structures Fall 2017 Lecture 10 Vector Iterators & Linked Lists

CSCI-1200 Data Structures Fall 2017 Lecture 2 STL Strings & Vectors

CSCI-1200 Data Structures Spring 2018 Lecture 10 Vector Iterators & Linked Lists

CSCI-1200 Data Structures Spring 2015 Lecture 2 STL Strings & Vectors

CSCI-1200 Data Structures Fall 2009 Lecture 12 Advanced Recursion

C++ for Java Programmers

CSCI-1200 Data Structures Spring 2016 Lecture 6 Pointers & Dynamic Memory

Computer Science II CSci 1200 Lecture 8 Iterators; Programming Examples

Introduction to Computer Science Midterm 3 Fall, Points

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

CSCI-1200 Data Structures Fall 2017 Lecture 9 Iterators & STL Lists

Pointers and References

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):

Computer Science II Lecture 1 Introduction and Background

CA31-1K DIS. Pointers. TA: You Lu

CE221 Programming in C++ Part 2 References and Pointers, Arrays and Strings

CSCI-1200 Data Structures Fall 2018 Lecture 7 Templated Classes & Vector Implementation

C++ Programming Chapter 7 Pointers

Homework #3 CS2255 Fall 2012

Pointers, Dynamic Data, and Reference Types

Data Structures CSci 1200 Test 2 Questions

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

Recap: Pointers. int* int& *p &i &*&* ** * * * * IFMP 18, M. Schwerhoff

Computer Science II CSci 1200 Test 1 Overview and Practice

Linked Lists CS 16: Solving Problems with Computers I Lecture #16

Programming for Engineers Arrays

Pointers (part 1) What are pointers? EECS We have seen pointers before. scanf( %f, &inches );! 25 September 2017

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

CSCI-1200 Data Structures Fall 2014 Lecture 8 Iterators

a data type is Types

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Arrays. Returning arrays Pointers Dynamic arrays Smart pointers Vectors

C++ Basic Elements of COMPUTER PROGRAMMING. Special symbols include: Word symbols. Objectives. Programming. Symbols. Symbols.

CprE 288 Introduction to Embedded Systems Exam 1 Review. 1

Variables and Operators 2/20/01 Lecture #

Ch. 11: References & the Copy-Constructor. - continued -

l Determine if a number is odd or even l Determine if a number/character is in a range - 1 to 10 (inclusive) - between a and z (inclusive)

C++ Programming: From Problem Analysis to Program Design, Third Edition

QUIZ How do we implement run-time constants and. compile-time constants inside classes?

CSCI-1200 Data Structures Fall 2010 Lecture 8 Iterators

Cpt S 122 Data Structures. Course Review Midterm Exam # 1

More on Strings in C++ Arrays CS 16: Solving Problems with Computers I Lecture #11

PIC 10A Pointers, Arrays, and Dynamic Memory Allocation. Ernest Ryu UCLA Mathematics

CS162 - POINTERS. Lecture: Pointers and Dynamic Memory

Agenda. Peer Instruction Question 1. Peer Instruction Answer 1. Peer Instruction Question 2 6/22/2011

Slide Set 3. for ENCM 339 Fall 2017 Section 01. Steve Norman, PhD, PEng

6. Pointers, Structs, and Arrays. 1. Juli 2011

CSCI-1200 Data Structures Fall 2018 Lecture 13 Problem Solving Techniques

Dynamic arrays / C Strings

CS Exam 2 Study Suggestions

Review of Important Topics in CS1600. Functions Arrays C-strings

CS Final Exam Review Suggestions - Spring 2014

CS31 Discussion 1E Spring 17 : week 08

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 8/19/ Review. Here s a simple C++ program:

More on Arrays CS 16: Solving Problems with Computers I Lecture #13

Operators. Lecture 3 COP 3014 Spring January 16, 2018

CS 61C: Great Ideas in Computer Architecture. C Arrays, Strings, More Pointers

Arrays and Pointers (part 1)

Arrays 2 CS 16: Solving Problems with Computers I Lecture #12

C: Pointers. C: Pointers. Department of Computer Science College of Engineering Boise State University. September 11, /21

Programming with Arrays Intro to Pointers CS 16: Solving Problems with Computers I Lecture #11

C How to Program, 7/e by Pearson Education, Inc. All Rights Reserved.

6. Pointers, Structs, and Arrays. March 14 & 15, 2011

UEE1302 (1102) F10 Introduction to Computers and Programming (I)

SYSC 2006 C Winter 2012

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 13, SPRING 2013

Exercise: Inventing Language

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

MPATE-GE 2618: C Programming for Music Technology. Syllabus

Objectives. In this chapter, you will:

Computer Science II CSci 1200 Sections 6-10 Week 3, Monday Lecture January 28, 2002 Functions, Structs and Multiple Files

Introduction to Programming in C Department of Computer Science and Engineering. Lecture No. #29 Arrays in C

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

C Language Part 1 Digital Computer Concept and Practice Copyright 2012 by Jaejin Lee

Objectives. Chapter 2: Basic Elements of C++ Introduction. Objectives (cont d.) A C++ Program (cont d.) A C++ Program

Chapter 2: Basic Elements of C++

Slide Set 3. for ENCM 339 Fall Steve Norman, PhD, PEng. Electrical & Computer Engineering Schulich School of Engineering University of Calgary

Chapter 2: Basic Elements of C++ Objectives. Objectives (cont d.) A C++ Program. Introduction

Slide Set 2. for ENCM 335 in Fall Steve Norman, PhD, PEng

Ch. 12: Operator Overloading

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 1/9/ Review. Here s a simple C++ program:

CIS 130 Exam #2 Review Suggestions

Physics 2660: Fundamentals of Scientific Computing. Lecture 3 Instructor: Prof. Chris Neu

Pointers. Addresses in Memory. Exam 1 on July 18, :00-11:40am

Overloading Functions & Command Line Use in C++ CS 16: Solving Problems with Computers I Lecture #6

Introduction to Computers and C++ Programming p. 1 Computer Systems p. 2 Hardware p. 2 Software p. 7 High-Level Languages p. 8 Compilers p.

by Pearson Education, Inc. All Rights Reserved.

Lexical Considerations

Lecture Notes on Memory Layout

CSCI-1200 Data Structures Fall 2014 Lecture 12 Recursion

BASIC COMPUTATION. public static void main(string [] args) Fundamentals of Computer Science I

Transcription:

CSCI-1200 Data Structures Fall 2012 Lecture 5 Pointers, Arrays, Pointer Arithmetic Announcements: Test 1 Information Test 1 will be held Tuesday, September 18th, 2012 from 2-3:50pm in West Hall Auditorium. No make-ups will be given except for pre-approved absense or illness, and a written excuse from the Dean of Students or the Student Experience office or the RPI Health Center will be required. Coverage: Lectures 1-6, Labs 1-3, and Homeworks 1-2. Closed-book and closed-notes except for 1 sheet of notes on 8.5x11 inch paper (front & back) that may be handwritten or printed. Computers, cell-phones, calculators, PDAs, music players, etc. are not permitted and must be turned off and placed under your desk. All students must bring their Rensselaer photo ID card. Practice problems from previous exams are available on the course website. Solutions to the problems will be posted later. The best way to prepare is to completely work through and write out your solution to each problem, before looking at the answers. The exam will involve handwriting code on paper (and other short answer problem solving). Neat legible handwriting is appreciated. We will somewhat forgiving to minor syntax errors it will be graded by humans not computers :) Review from Last Week C++ class syntax, designing classes, classes vs. structs; Passing comparison functions to sort; Non-member operators. Today s Lecture Pointers and Arrays Optional Reading: Ford & Topp pp. 219-228; Koenig and Moo, Section 10.1 Pointers store memory addresses. They can be used to access the values stored at their stored memory address. They can be incremented, decremented, added and subtracted. Dynamic memory is accessed through pointers. Pointers are also the primitive mechanism underlying vector iterators, which we have used with std::sort and will use more extensively throughout the semester. 5.1 Pointer Example Consider the following code segment: Before *p=72 After *p=72 float x = 15.5; float *p; /* equiv: float* p; or float * p; */ p = &x; *p = 72; if ( x > 20 ) cout << "Bigger\n"; else cout << "Smaller\n"; x p 15.5 x 72.0 p The output is Bigger because x == 72.0. What s going on? Computer memory

5.2 Pointer Variables and Memory Access x is an ordinary float, but p is a pointer that can hold the memory address of a float variable. The difference is explained in the picture above. Every variable is attached to a location in memory. This is where the value of that variable is stored. Hence, we draw a picture with the variable name next to a box that represents the memory location. Each memory location also has an address, which is itself just an index into the giant array that is the computer memory. The value stored in a pointer variable is an address in memory. The statement p = &x; takes the address of x s memory location and stores it (the address) in the memory location associated with p. Since the value of this address is much less important than the fact that the address is x s memory location, we depict the address with an arrow. The statement: *p = 72; causes the computer to get the memory location stored at p, then go to that memory location, and store 72 there. This writes the 72 in x s location. Note: *p is an l-value in the above expression. 5.3 Defining Pointer Variables In the example below, p, s and t are all pointer variables (pointers, for short), but q is NOT. You need the * before each variable name. int * p, q; float *s, *t; There is no initialization of pointer variables in this two-line sequence, so the statement below is dangerous, and may cause your program to crash! (It won t crash if the uninitialized value happens to be a legal address.) *p = 15; 5.4 Operations on Pointers The unary (single argument/operand) operator * in the expression *p is the dereferencing operator. It means follow the pointer *p can be either an l-value or an r-value, depending on which side of the = it appears on. The unary operator & in the expression &x means take the memory address of. Pointers can be assigned. This just copies memory addresses as though they were values (which they are). Let s work through the example below (and draw a picture!). What are the values of x and y at the end? float x=5, y=9; float *p = &x, *q = &y; *p = 17.0; *q = *p; q = p; *q = 13.0; Assignments of integers or floats to pointers and assignments mixing pointers of different types are illegal. Continuing with the above example: int *r; r = q; // Illegal: different pointer types; p = 35.1; // Illegal: float assigned to a pointer Comparisons between pointers of the form if ( p == q ) or if ( p!= q ) are legal and very useful! Less than and greater than comparisons are also allowed. These are useful only when the pointers are to locations within an array. 2

5.5 Exercise What is the output of the following code sequence? int x = 10, y = 15; int *a = &x; cout << x << " " << y << endl; int *b = &y; *a = x * *b; cout << x << " " << y << endl; int *c = b; *c = 25; cout << x << " " << y << endl; 5.6 Null Pointers Pointers that don t (yet) point anywhere useful should be explicitly assigned the value 0, a legal pointer value. Most compilers define NULL to be a special pointer equal to 0. Comparing a pointer to NULL is very useful. It can be used to indicate whether or not a pointer has a legal address. (But don t make the mistake of assuming pointers are automatically initialized to NULL.) For example, if ( p!= NULL ) cout << *p << endl. tests to see if p is pointing somewhere that appears to be useful before accessing the value stored at that location. Dereferencing a null pointer leads to a memory exception (which causes the program to crash). 5.7 Arrays Here s a quick example to remind you about how to use an array: const int n = 10; double a[n]; int i; for ( i=0; i<n; ++i ) a[i] = sqrt( double(i) ); Remember: the size of array a is fixed at compile time. STL vectors act like arrays, but they can grow and shrink dynamically in response to the demands of the application. 5.8 Stepping through Arrays with Pointers Pointers are the iterators for arrays. The array initialization code above, can be rewritten as: const int n = 10; double a[n]; double *p; for ( p=a; p<a+n; ++p ) *p = sqrt( p-a ); The assignment: p = a; takes the address of the start of the array and assigns it to p. This illustrates the important fact that the name of an array is in fact a pointer to the start of a block of memory. We will come back to this several times! We could also write this line as: p = &a[0]; which means find the location of a[0] and take its address. 3

The test p<a+n checks to see if the value of the pointer (the address) is less than n array locations beyond the start of the array. We could also have used the test p!= a+n By incrementing, ++p, we make p point to the next location in the array. In the assignment: *p = sqrt( p-a ) p-a is the number of array locations between p and the start. This is an integer. The square root of this value is assigned to *p. Here s a picture to explain this example: const int n 10 a[10] increasing address value double [] a 3.00 2.83 2.65 2.45 2.23 2.00 1.73 1.41 1.00 0.00 a[9] a[8] a[7] a[6] a[5] a[4] a[3] a[2] a[1] a[0] double* p 5.9 Sorting an Array Arrays may be sorted using std::sort, just as vectors may. Pointers are used in place of iterators. For example, if a is an array of doubles and there are n values in the array, then here s how to sort the values in the array into increasing order: std::sort( a, a+n ) 4

5.10 Exercises For each of the following problems, you may only use pointers and not subscripting: 1. Write code to print the array a backwards, using pointers. 2. Write code to print every other value of the array a, again using pointers. 3. Write a function that checks whether the contents of an array of doubles are sorted into increasing order. The function must accept two arguments: a pointer (to the start of the array), and an integer indicating the size of the array. 5.11 Character Arrays and String Literals In the line below "Hello!" is a string literal and it is also an array of characters (with no associated variable name). cout << "Hello!" << endl; A char array can be initialized as: char h[] = { H, e, l, l, o,!, \0 }; or as: char h[] = "Hello!"; In either case, array h has 7 characters, the last one being the null character. The C and C++ languages have many functions for manipulating these C-style strings. We don t study them much anymore because the standard string library is much more logical and easier to use. One place we do use them is in file names and command-line arguments, as you have already seen. 5.12 Conversion Between Standard Strings and C-Style String Literals We have been creating standard strings from C-style strings all semester. Here are 2 different examples: string s1( "Hello!" ); string s2( h ); where h is as defined above. You can obtain the C-style string from a standard string using the member function c_str, as in s1.c_str(). 5

5.13 C Calling Convention A calling convention is a standardized method for passing arguments between the caller and the function. Calling conventions vary between programming languages, compilers, and computer hardware. In C on x86 architectures here is a generalization of what happens: 1. The caller puts all the arguments on the stack, in reverse order. 2. The caller puts the address of its code on the stack (the return address). 3. Control is transferred to the callee. 4. The callee puts any local variables on the stack. 5. The callee does its work and puts the return value in a special register (storage location). 6. The callee removes its local variables from the stack. 7. Control is transferred by removing the address of the caller from the stack and going there. 8. The caller removes the arguments from the stack. On x86 architectures the addresses on the stack are in descending order. This is not true of all hardware. 5.14 Poking around in the stack int foo(int a, int *b) { int q = a+1; int r = *b+1; cout << "address of a = " << &a << endl; cout << "address of b = " << &b << endl; cout << "address of q = " << &q << endl; cout << "address of r = " << &r << endl; cout << "value at " << &a << " = " << a << endl; cout << "value at " << &b << " = " << b << endl; cout << "value at " << b << " = " << *b << endl; cout << "value at " << &q << " = " << q << endl; cout << "value at " << &r << " = " << r << endl; return q*r; } int main() { int x = 5; int y = 7; int answer = foo (x, &y); cout << "address of x = " << &x << endl; cout << "address of y = " << &y << endl; cout << "address of answer = " << &answer << endl; cout << "value at " << &x << " = " << x << endl; cout << "value at " << &y << " = " << y << endl; cout << "value at " << &answer << " = " << answer << endl; } Sample Output address of a = 0x23eef0 address of b = 0x23eef4 address of q = 0x23eee4 address of r = 0x23eee0 value at 0x23eef0 = 5 value at 0x23eef4 = 0x23ef10 value at 0x23ef10 = 7 value at 0x23eee4 = 6 value at 0x23eee0 = 8 address of x = 0x23ef14 address of y = 0x23ef10 address of answer = 0x23ef0c value at 0x23ef14 = 5 value at 0x23ef10 = 7 value at 0x23ef0c = 48 0x23ef18 x= 0x23ef14 y= 0x23ef10 answer= 0x23ef0c 0x23ef08 0x23ef04 0x23ef00 0x23eefc 0x23eef8 b= 0x23eef4 a= 0x23eef0 0x23eeec 0x23eee8 q= r= 0x23eee4 0x23eee0 0x23eedc 0x23eed8 5 7 48 0x23ef10 5 6 8 6