A pointeris an indirect reference to an object of a specified type
(address of a location where an object of a given type may be stored).
int n; // an integer
int *p; // a pointer to an integer
int *p, *q, n;
n = -16;
*p = 101;
*q = n + *p;
p = q;
Pointers and Arrays (name of an array can be used
as a pointer to the first element in the array)
double a[10];
double* p = a;
a[6] == p[6] == *(p+6)
Functions and Arrays (the contents of an array can be modified by a function)
void Swap2(Card *c, int firstIndex, secondIndex)
{
Card temp = c[firstIndex];
c[firstIndex] = c[secondIndex];
c[secondIndex] = temp;
}
new and delete Operators
int* p; or
p = new int; int* p = new int;
Fraction* fp = new Fraction;
Fraction* fp = new Fraction(3,7);
class Pair
// A class representing ordered pairs of integers (x, y)
{
public:
Pair(); // construct the pair (0,0)
void Show(); // Displays the elements
int x, y; // the two elements of the pair
};
:
Pair* p = new Pair;
:
cout << "the first component is " << (*p).x;
cout << "Here's the entire pair: ";
(*p).Show();
:
cout >> "The first component is " << p->x;
cout << "Here's the entire pair: ";
p->Show();
Dynamic Arrays
class Directory
{
:
Entry* entryList;
:
}
:
entryList = new Entry[5]; //allocates room for 5 Entrys
Pointers and Strings
char string1[15] = "Object Concept";
char* string2 = string1;
"zero terminated" strings \0
cout << string1;
cin >> anotherString; //reads until a "white space"
is reached
get(char* string, int length, char delimiter = '\n'); //reads
until length or delimiter reached
getline(char* string, int length, char delimiter = '\n'); //same
as get except it extracts terminating delimiter
int strlen (const char *s)
{
int i = 0;
while (s[I] != '\0')
i++;
return i;
}
int strlen(const char* s)
{
for (int i = 0; s[i]; i++);
return i;
}
int strcmp (const char* s1, const char* s2)
// compares strings s1 and s2 for lexicographic order, returning 0 if equal
{
int i = 0;
while ((s1[i] != '0') && (s1[i] == s2[i]))
i++;
return (s1[i] - s2[i]);
}
int strcmp (const char* s1, const char* s2)
{
while ((*s1) && (*s1 == *s2))
{
++;
++;
}
return (*s1 - *s2);
}
QUESTION: What happens if we reverse the order of s1 and s2?
char* strcpy (char* s1, const char* s2)
// copies s2 into s1 and returns a pointer to the new string
{
for (int j = 0; s2[j] != '\0'; j++)
s1[j] = s2[j];
s1[j] = s2[j]; //copies the terminator
return s1;
}
char* strcpy (char* s1, const char* s2)
{
char* temp = s1;
while (*s2)
*s1++ = *s2++;
*s1 = *s2;
return temp;
}
QUESTION: Is temp necessary? Why?
Pointers as Links: A Preview
struct Node
{
int value; // the integer stored in the node
Node* link; // a pointer to the next node in the list
};
void ModifiedSwap(Card* p1, Card* p2)
//p1 and p2 are pointers to cards, so the arguments must be pointers
{
Card temp = *p1;
*p1 = *p2;
*p2 = temp;
}
Reference Types (aliases) - must be defined to refer to a variable
when it is declared or as a formal argument to a function
int n = 10;
int& r = n;
r = 20;
void SimpleSwap(Card& r1, Card& r2)
//r1 and r2 are references to cards
{
Card temp = r1;
r1 = r2;
r2 = temp;
}
class ostream
{
public:
//---------Overloads of << Operator
ostream& operator<<(const char* string);
ostream& operator<<(char c);
ostream& operator<<(int n);
ostream& operator<<(double v);
};
cout << j < '\n';
friend ostream& operator<<(ostream &s, Fraction
f);
ostream& operator<<(ostream& s, Fraction f)
// Inserts the numerator, '/', and the denominator into the ostream s, and then
// returns a reference to s
{
s << f.numerator << '/' << f.denominator;
return s;
}
class istream
{
public:
istream& operator>>(char* string);
istream& operator>>(char& c);
istream& operator>>(int& n);
//--------Utility Routines---------
istream& get(char* string, int length, char delimiter = '\n');
istream& get(char& c); // extract a single character
int get(); // get one character and return it in an int.
istream& getline(char* string, int length, char delimiter
= '\n');
:
friend istream& operator>>(istream& s, Fraction&
f);
phone directory - list of entries
entry - name, address, phone #
class entry
{
friend istream& operator>>(istream& s, Entry&
e);
friend ostream& operator<<ostream& s, Entry e);
public:
Entry();
char* GetName();
private:
char name[20];
char phoneNumber[20];
char address[20];
};
class Directory
{
public:
Directory();
~Directory();
void Insert();
void Lookup();
void Remove();
void Update();
void DisplayDirectory();
private:
int maxSize, currentSize;
Entry* entryList;
void Grow();
int FindName(char* aName);
};
destructor
no arguments
handles all tasks before an object is destroyed
Directory::~Directory()
{
delete entryList;
}
if
then delete [] entryList;
The Main Program:
//----------------- PIP6.CPP -----------------
// Test program and general support functions
// for phone directory
#include <ctype.h> // for toupper
#include <iostream.h> // for cin, cout
#include "FONEBOOK.H" // for class Directory
void ShowMenu()
// Display the main program menu.
{
cout << "\n\t\t*** PIP 6 PHONE DIRECTORY ***";
cout << "\n\tI \tInsert a new entry into the directory";
cout << "\n\tL \tLook up an entry";
cout << "\n\tR \tRemove an entry";
cout << "\n\tU \tUpdate an entry";
cout << "\n\tD \tDisplay the entire directory";
cout << "\n\t? \tDisplay this menu";
cout << "\n\tQ \tQuit";
}
char GetAChar(char* promptString)
// Prompt the user and get a single character, discarding the
Return character.
// Used in GetCommand.
{
char response; // the char to be returned
cout << promptString; // Prompt the user
cin >> response; // Get a char,
response = toupper(response); // and convert it to uppercase
cin.get(); // Discard newline char from input.
return response;
}
char Legal(char c)
// Determine if a particular character, c, corresponds to a legal
menu command.
// Returns 1 if legal, 0 if not. Used in GetCommand.
{
return ((c == 'I') || (c == 'L') || (c == 'R') || (c == 'U') ||
(c == 'D') || (c == '?') || (c == 'Q'));
}
char GetCommand()
// Prompts the user for a menu command until a legal
// command character is entered. Return the command character.
// Calls GetAChar, Legal, ShowMenu.
{
char cmd = GetAChar("\n\n>"); // Get a command character.
while (!Legal(cmd)) // As long as it's not a legal command,
{ // display menu and try again.
cout << "\nIllegal command, please try again . . .";
ShowMenu();
cmd = GetAChar("\n\n>");
}
return cmd;
}
void main()
{
Directory d; // Create and initialize a new directory.
ShowMenu(); // Display the menu.
char command; // menu command entered by user
do
{
command = GetCommand(); // Retrieve a command.
switch (command)
{
case 'I': d.Insert(); break;
case 'L': d.Lookup(); break;
case 'R': d.Remove(); break;
case 'U': d.Update(); break;
case 'D': d.DisplayDirectory(); break;
case '?': ShowMenu(); break;
case 'Q': break;
}
} while (command != 'Q');
}