Intro to Data Structures and ADTs

Download Report

Transcript Intro to Data Structures and ADTs

C++ Pointers
Gordon College
1
Regular variables
• Regular variables declared
– Memory allocated for value
of specified type
– Variable name associated
with that memory location
– Memory initialized with
values provided (if any)
27
2
Pointers
• Pointer Variables
– contains a memory address
– pointer variable should be typed
• However could be a void pointer
int *Ptr
void *Vptr
– two operators:
• Dereference
• Address of
*
&
3
Basic Pointer Operations
• Dereferencing and indirection
– Pointer variable stores address of a location
– Accessing contents of that location requires
dereferencing operator *
cout << *iPtr;
Dereferencing pointer
int *iPtr = &i;
PointerFun Video
Pointer declaration
4
Basic Pointer Operations
• Assignment
– Pointer variables can be assigned the values of
other pointer variables bound to same type
int *iPtr = &i;
int *jPtr = &j;
jPtr = iPtr;
5
Basic Pointer Operations
• Consider:
*jPtr = 44;
– Changes value that both pointers reference
– Not good programming practice, hard to
debug
– Known as aliasing problem
6
Basic Pointer Operations
• Comparison
– Relational operators used to compare two
pointers
– Must be bound to same type
– Most common
= = and !=
– The null address may be compared with any
pointer variable
int* t;
double *d;
if (t == d)
…
ERROR
Fix:
if (t == (int*) d)
7
Initial value for pointers
• Variables are not automatically given an
initial value by the system - they start with
whatever garbage is left in memory when
they are allocated.
#include <cstdlib>
...
Node* head = NULL; // Initialized pointer to NULL.
WARNING: Invalid addresses in pointer can cause problems known as “wild pointers” when not initialized
8
Pointers vs. References
• Consider this code:
int i;
int *p = &i;
int i;
int &r = i;
*p = 5;
r = 5;
Both p and r contain addresses which point to the variable i, however
these “addressing” variables are used differently in code.
Why bother with pointers?
9
Pointers vs. References
• Pointer arithmetic
i.e.
p++
p--
ptr = sptr + 1;
char* GetFirstT(char* p)
{
for ( ; *p ; ++p)
{
if ( *p == 't' ) return p;
}
return 0;
}
OUTPUT: 19
signed main()
{
char the_alphabet[] = "abcdefghijklmnopqrstuvwxyz";
char* p_t = GetFirstT(the_alphabet);
cout << p_t - the_alphabet << endl;
}
10
Dynamic Memory Allocation
• The new operation
• Example
int * intPtr;
intPtr = new int;
– An anonymous variable
– Cannot be accessed directly
– Warning: watch out for memory leak
11
Memory Management Problems
• Memory leak - program fails to release memory when no
longer needed
{
int *t = new int(4);
}
Solution: must use the delete command before existing block
• Dangling Pointer - an object is deleted or deallocated,
without modifying the value of the pointer.
char *cp = NULL;
{
char c;
cp = &c;
}
Solution: set pointer to NULL before exiting block
12
Pointer Arguments
• Pointers can be passed as arguments to
functions
• This is logically equivalent to reference
parameters
– In fact, this is how early C++ compilers
accomplished reference parameters
13
Pointer to a Pointer
int cow(7);
int* p_cow = &cow;
int** p_p_cow(&p_cow);
int*** p_p_p_cow = &p_p_cow;
Name of Variable Type of Variable
Cow
Int
p_cow
int*
p_p_cow
int**
p_p_p_cow
int***
Address in Memory
108
110
112
114
Value Stored
7
108
110
112
int cow(7);
int* p_cow = &cow;
int** p_p_cow(&p_cow);
int*** p_p_p_cow = &p_p_cow;
***p_p_p_cow = 8;
14
Pointer to objects
• Declaration:
classType *name = &object
• Accessing the object:
(*name).method();
name->method();
15
Pointers to objects (from lab2)
Pet * kennel[10];// The cages in the kennel
char dashes[] = "----------------------------------------";
kennel[0] = new Rodent("Mickey", "W. Disney", "01/01/2002", "01/04/2002","mouse");
kennel[1] = new Bird("Tweety", "Granny", "9.1.2001", "9/5/2001","canary");
kennel[2] = new Reptile("Ignatius", "B. Starr", "10/07/2001", "10/10/2001","iguana");
kennel[3] = new Cat("Garfield", "J. Arbuckle", "01/01/2002", "01/31/2002",20, true);
kennel[4] = new Dog("Snoopy", "C. Brown", "01/01/2002", "01/02/2002",15, false, "beagle");
kennel[5] = new Cat("Sylvester", "Granny", "09/01/2001", "09/05/2001",15, false);
kennel[6] = new Dog("Butch", "Granny", "09/01/2001", "09/05/2001",45, true, "bulldog");
kennel[9] = kennel[8] = kennel[7] = NULL;
for (int i = 0; i < 10 && kennel[i] != NULL; i++)
{
cout << endl << dashes << dashes << endl << endl;
cout << "Bill for: " << kennel[i] -> getName() << endl << endl;
kennel[i] -> printBill();
cout << endl << dashes << dashes << endl;
}
16