2. pointer

28
Computer Science and Software Engineering University of Wisconsin - Platteville 2. Pointer Yan Shi CS/SE2630 Lecture Notes

Upload: metea

Post on 14-Feb-2016

43 views

Category:

Documents


0 download

DESCRIPTION

2. Pointer. Yan Shi CS/SE2630 Lecture Notes. floating. address. float double long double. pointer reference. C++ Data Types. simple. structured. integral enum. array struct union class. char short int long bool. What is reference?. simple data type - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 2. Pointer

Computer Science and Software EngineeringUniversity of Wisconsin - Platteville

2. PointerYan Shi

CS/SE2630 Lecture Notes

Page 2: 2. Pointer

2

C++ Data Types

structured

array struct union class

address

pointer reference

simple

integral enum

char short int long bool

floating

float double long double

Page 3: 2. Pointer

What is reference? simple data type: reference operator & the address of a variable of certain data type int num = 10; int &rNum = num;

Do you remember?— an array or object must be passed as a reference parameter

int nums[10];Student stu;StudentList stuList;…avg = Average(nums);stuList.Add(stu);

Once a reference is created, it cannot be later made to refer another variable/object; it cannot be reseated.

int Average( const int myArray[] );

void Add( const Student& stu );

Page 4: 2. Pointer

What is a pointer variable?

A pointer variable is a variable whose value is the address of a location in memory.

Unlike a reference variable, a pointer can redirect to other locations later.

To declare a pointer variable, you must specify the type of value that the pointer will point to.

int *p; // p will hold the address of an int

char *q; // q will hold the address of a charint a, *b; // * is paired with the identifier. // In this case, we have a int variable a and // a pointer of int type b

Page 5: 2. Pointer

For a normal variable int num; .

.

.

.

.

.

MemoryAddress identifier

.

.

.

? num0010

Page 6: 2. Pointer

For a normal variable int num; num = 50;

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

50 num0010

Page 7: 2. Pointer

Pointer int num; num = 50; int *p;

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

50 num0010

? p0012A pointer variable contains the memory address of another variable.

Page 8: 2. Pointer

Pointer int num; num = 50; int *p; p = #

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

50 num0010

0010 p0012

& is the reference(address-of )operator.

Page 9: 2. Pointer

Pointer int num; num = 50; int *p; p = &num; cout << *p;

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

50 num0010

(*) here is the dereference operator.*p is used to access the place p points to. you will see 50 on the screen.

0010 p0012

Page 10: 2. Pointer

Pointer int num; num = 50; int *p; p = &num; cout << *p; *p = 100;

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

100 num0010

change the value at the address p points to 100

0010 p0012

//direct addressing

//indirect addressing

Page 11: 2. Pointer

char ch; ch = ‘A’;

char* q; q = &ch;

*q = ‘Z’; char* p; p = q; // the right side has value 4000 // now p and q both point to ch

Another Example 4000

A Z

ch

5000 6000

4000 4000

q p

Page 12: 2. Pointer

NULL pointer Use NULL to initialize pointers that don’t currently

point to anything.— used to initialize pointers— can be converted to pointers of any type— <cstddef>

int *p = NULL;

It is an error to dereference a pointer whose value is NULL. It is the programmer’s job to check for this.

Page 13: 2. Pointer

Dynamic Memory Allocation

In the previous example, memory space for num and p are statically allocated — at compile time— from stack memory (activation record and global

variables) Dynamic memory allocation

— at run time— from heap memory (free store: dynamic)

In java, all user-defined types are allocated from heap In C++, use new operator to get data from heap

Page 14: 2. Pointer

Dynamic Memory Allocation

int *p = new int; ...

.

.

.

MemoryAddress identifier

.

.

.

p0010

Page 15: 2. Pointer

Dynamic Memory Allocation

int *p = new int; ...

.

.

.

MemoryAddress identifier

.

.

.

?

p0010

unnamed dynamicallyallocated integer variable(from heap)

0080

Page 16: 2. Pointer

Dynamic Memory Allocation

int *p = new int;

With Initialization: int *p = new int(99);

.

.

.

.

.

.

MemoryAddress identifier

.

.

.

?

p0010 0080

0080

The dynamically allocated variablecan only be indirectly addressed through the pointer returned by new.

unnamed dynamicallyallocated integer variable(from heap)

Page 17: 2. Pointer

What does new do? It takes a pointer variable, allocates heap memory for it to point, and leaves the address of the assigned

memory in the pointer variable. If there is no more memory, the pointer

variable is set to NULL.

Page 18: 2. Pointer

Dynamic Array Using new, now we can dynamically decide the

size of an array.

int size;cin >> size;char *text = new char[size];

Page 19: 2. Pointer

Pointers and Arrays C++ arrays are not objects as in Java. They are really just

pointers!char name[30]; // name is actually &name[0]char *np;np = &name[0]; // same as np = name;

C++ allows pointer arithmetic:…cin >> *np;while( *np != ‘/n’ ){ np++; cin >> *np;}

name is a constant pointer. name[i] is the same as *(name + i)

// hope that all names are // shorter than 30 characters// moves np ahead sizeof(char) bytes // and points to the next element.

Page 20: 2. Pointer

Pointers and Objects How to declare an object?

Student stu(…); OR

Student *stu = new Student(…);

For the second declaration, we can make a public method call like this:

stu->GetGPA();

// stu is a Student object// located at the stack memory

// stu is a pointer of Student type // located at the heap memory

// This is the same as// (*stu).GetGPA();

Page 21: 2. Pointer

Pointers and Objects We can make a dynamic array of objects:

Student * stuList = new Student[n]; In this case, Student must have a default constructor!

An alternative is to make a dynamic array of Student pointers

Student **stuList = new Student*[n]; In this case, no default constructor is needed, but

memory management becomes more complicated.

Page 22: 2. Pointer

Memory Leak Memory is allocated but not released causing an application to consume memory reducing the available memory for other applications and eventually causing the system to page virtual memory to the hard drive slowing the application or crashing the application when the computer memory resource limits are reached.

Example:int *p1 = new int;int *p2 = new int(99);*p1 = 10;p2 = p1; // The memory cell p2 originally

// points at now can no longer be // accessed this is called garbage.

Page 23: 2. Pointer

Deallocate Memory: delete

delete operator is used to return to the heap a memory location allocated previously by the new operator.

A pointer p is pointing to a dynamically allocated space. When to delete p?— p is about to point to another space;— right before the program exit.

int *p1 = new int;int *p2 = new int(99);*p1 = 10;delete p2; // This prevents memory leak.p2 = p1; …int *a = new int(n);…delete[] a; // deallocate the entire array space.

Page 24: 2. Pointer

Enable Memory Leak Detection Visual Studio provides C Run-Time Libraries (CRT) debug heap

functions. To enable:

include in the exact order.

add _CrtDumpMemoryLeaks(); immediately before the program exit.

When you run your program under the debugger, _CrtDumpMemoryLeaks displays memory leak information in the Output window.

#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>

Page 25: 2. Pointer

Dangling Pointer Pointers that do not point to a valid object.

— Dangling pointers arise when an object is deleted or deallocated, without modifying the value of the pointer, so that the pointer still points to the memory location of the deallocated memory.

— If later the program dereferences the (now) dangling pointer, unpredictable behavior may result.

That is why Java introduced automatic garbage collection!

Page 26: 2. Pointer

Dangling Pointer Example

8

ptr

-5

ptr2

int* ptr = new int; *ptr = 8; int* ptr2 = new int; *ptr2 = -5; ptr = ptr2;

8 cannot be addressed and thus become a garbage

Page 27: 2. Pointer

Dangling Pointer Example

int* ptr = new int; *ptr = 8; int* ptr2 = new int; *ptr2 = -5; ptr = ptr2;

delete ptr2;// ptr is left dangling ptr2 = NULL;

8

ptr

NULL

ptr2

Page 28: 2. Pointer

Dangling Pointer Example common mistake: returning address of local data

Both create dangling pointers!— xyz will be deleted after the function call— returned pointer will be pointing to empty slot.

X* foo() { X xyz; ... operate on xyz ... return &xyz;}

char* g() { char str[100]; ... operate on str ... return str; }