02393 C++ Programming
C++
Lecture 6:
Pointers, arrays and files.
Chapter 10:
Managing memory and low-level data structures
Christian W. Probst 1
Agenda
C++
Pointers and arrays
Pointers, Pointers to functions, Arrays,
Pointer arithmetic, Indexing, Array
initialization
Examples for arrays
String literals, array initialization, arguments
to main, reading and writing files
Three kinds of memory management
Allocating and deallocating objects and
arrays
6: Pointers, arrays and files 2
10.1 Pointers and arrays
C++
An array is a kind of container
0 1 2 3 4
These containers are created with the new expression
and disposed with the delete expression.
A pointer points into a container and is a kind of random-
access iterator
Pointers and arrays are the most primitive data structures in
C and C++
6: Pointers, arrays and files 3
10.1.1 Pointers
C++
A pointer is a value that represents the address of an object.
Every distinct object has a unique address in the memory (RAM)
of the computer
If x is an object then &x is the address of that object
If p is the address of an object then *p is the object itself
The & in &x is called address operator
The * is called dereference operator
it works like * works when applied to any other iterator.
(Another way to dereference the object stored in p is p-> )
6: Pointers, arrays and files 4
10.1.1 Pointers (cont.)
C++
If p contains the address of x, we also say that p is a
pointer that points to x:
p x
A local variable with a pointer type has no meaningful
value until we initialize it:
Often programmers give the pointer the value 0
int * p = 0; //often called the null pointer
graphic notation for
p
the null pointer
6: Pointers, arrays and files 5
10.1.1 Pointers (cont.)
C++
Different ways to declare pointers:
int *p; // *p has type int
int* p; // p has type int*
int *p, q;
int* p, q;
int (*p), q;
int q; // 'q' a simple variable of type int
int *p; // 'p' is a pointer
6: Pointers, arrays and files 6
10.1.2 Pointers to functions
C++
int (*fp) (int);
//fp is a pointer to a
//function, which can take an int as
//argument and returns an int
int next (int n){
return n + 1;
}
fp = &next;
fp = next;
Functions that return pointers to functions are rare!
Please explore the subject in detail ($A.1/page 295)
if and when you need it in the future.
6: Pointers, arrays and files 7
10.1.3 Arrays
C++
An array is a kind of a container – that is part of the core language
rather than part of the standard library
Every array contains a sequence of one or more objects (elements)
of the same type
If the array is declared in the code then its dimension must be
known at compile time:
double coords[3]; //a point in 3-dim space
*coords = 1.5 //sets the first
//element of cords to 1.5
This shows the fundamental relationsship between arrays and
pointer
coords without an index or without the * means the address of the
array's first element.
*coords is the same as coords[0]
6: Pointers, arrays and files 8
10.1.4 Pointer Arithmetic
C++
A pointer is a kind of iterator
Can be incremented/decremented with ++/--
A pointer is a random-access iterator
If p points to the nth element of an array, then p+m points
to the (n + m)th element in the array
assuming that the element exists
BUT the compiler will not complain if the element does
NOT exist
6: Pointers, arrays and files 9
10.1.5 Indexing
C++
The variable containing an array stores the address of the
first element of the array
If a points to an array, then a[n] is the nth element of
the array
If pointer p points to the mth element of an array, p[n] is
the address of the m+nth element of the array
If p is a pointer and n is an integer then
p[n] is equivalent to *(p+n)
6: Pointers, arrays and files 10
10.1.6 Array initialization
C++
const int month_lengths[] = {
31, 28, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31
}
int tabel[10][10];
for(int i=0, i < 10, i++)
for (int j=0; j <10, j++)
tabel[i][j] = (i+1)*(j+1);
6: Pointers, arrays and files 11
Agenda
C++
Pointers and arrays
Pointers, Pointers to functions, Arrays,
Pointer arithmetic, Indexing, Array
initialization
Examples for arrays
String literals, array initialization, arguments
to main, reading and writing files
Three kinds of memory management
Allocating and deallocating objects and
arrays
6: Pointers, arrays and files 12
10.2 String literals revisited
C++
A string literal is really an array of const char
with one more element than the number of characters in
the literal.
The extra character is the null character (i.e. '\0’ or binary zero)
const char hello[]={'H','e','l','l','o','\0'};
The variable hello has exactly the same ”meaning” as the
string literal "Hello"
BUT the two strings are really 2 different objects, and therefor
have different addresses.
6: Pointers, arrays and files 13
10.3 Initializing arrays of character pointers
C++
string letter_grade(double grade)
{
// range posts for numeric grades
static const double numbers[] = {
97, 94, 90, 87, 84, 80, 77, 74, 70, 60, 0
};
// names for the letter grades
static const char* const letters[] = {
"A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D", "F"
};
// compute the number of grades given the size of the array
// and the size of a single element
static const size_t ngrades = sizeof(numbers)/sizeof(*numbers);
// given a numeric grade, find and return the associated letter grade
for (size_t i = 0; i < ngrades; ++i) {
if (grade >= numbers[i])
return letters[i];
}
return "?\?\?";
}
6: Pointers, arrays and files 14
10. 4 Arguments to main
C++
int main(int argc, char** argv)
{
// if there are command-line arguments, write them
if (argc > 1) {
cout << argv[1]; // write the first argument
// write each remaining argument with a space before it
for (int i = 2; i != argc; ++i)
cout << " " << argv[i]; // 'argv[i]' is a 'char*'
}
cout << endl;
return 0;
}
6: Pointers, arrays and files 15
10.5 Reading and writing files
C++
The book uses cin and cout – and also some few different types of
files for input and putput (the standard input [stdin] and output
[stdout] are in the world of UNIX/LINUX considered as files)
The keyboard is a file (the standard input file)
The display is a file (the standard output file)
A directory is a file
The harddisk is a file
The tapestation is a file
The network is a file
Etc…
6: Pointers, arrays and files 16
10.5.1 The standard error stream
C++
cerr or clog is used to write to the standard error streams
clog is more for logging purposes – accordingly it has the
same buffering as cout
The cerr stream always writes it output immediately
unless it is redirected:
$ exefile >2 logfailfile
6: Pointers, arrays and files 17
10.5.2 Dealing with multiple input and output
C++
#include <fstream> //and a lot of using:: xxx
int main()
{
ifstream infile("in");
ofstream outfile("out");
string s;
while (getline(infile, s))
outfile << s << endl;
return 0;
}
6: Pointers, arrays and files 18
Agenda
C++
Pointers and arrays
Pointers, Pointers to functions, Arrays,
Pointer arithmetic, Indexing, Array
initialization
Examples for arrays
String literals, array initialization, arguments
to main, reading and writing files
Three kinds of memory management
Allocating and deallocating objects and
arrays
6: Pointers, arrays and files 19
10.6 Three kinds of memorys managements
C++
1. Automatic memory mangement
associated with local variables
Dont do this:
int * invalid_pointer() { int x; return &x; }//invalid
2. Statically allocated
associated with local variables
A bit better, BUT
int * pointer_to_static(){
static int x; return &x; //Now better, but …..
}
3. Dynamic allocation
allocating and deallocating an object with new and delete
keywords
6: Pointers, arrays and files 20
10.6.1 Allocating and deallocation an object
C++
int * p = new int (42);
/*create a pointer p, which point to an object of type
int with the value 42
*/
++*p; // *p is now 43 (that is, the value of the object)
delete p; // the object is deleted
// every time invoked, create a new int object
int* pointer_to_dynamic() {
return new int(0);
}
6: Pointers, arrays and files 21
10.6.2 Allocating and deallocation an array
C++
T * p = new T[n];
If T is a type and n is a nonnegative integer, then
New T[n]
allocates an array of n objects of type T.
The pointer to the array is stored in p.
What does the following do if p points to an array of
type T?
vector <T> v(p, p+n);
delete[] p;
6: Pointers, arrays and files 22
Linked list
C++
A single linked list consists of objects that are pointing to
each other:
A typical list type would look like this:
struct listelem {
char data;
listelem* next
};
What would we need to put in a class for single linked
lists?
6: Pointers, arrays and files 23
Linked list (cont.)
C++
class list {
public:
list(): h(0){} //0 denotes an empty list
void prepend(char c); // add to front of list
listelem* first() const {return (h);}
void del();
void print() const;
private:
listelem* h; // head of the list
}
The link member next points to next element in the list
6: Pointers, arrays and files 24
Linked list (cont.)
C++
The member function prepend is used to build the list
structure:
void list::prepend(char c) {
listelem* temp = new listelem; //create new elem
temp -> next = h;
temp -> data = c;
h = temp; //update head of list
}
6: Pointers, arrays and files 25
Linked list (cont.)
C++
The member function del has the role of deleting the
first element:
void del ()
{
listelem* temp = h;
h = h -> next;
delete temp;
}
6: Pointers, arrays and files 26
Linked list (cont.)
C++
void list::print()const //object is unchanged
{
listelem* temp = h;
while (temp !=0){ //detect end of list
cout << temp -> data << ”->”;
temp = temp -> next;
}
cout << ”\n###\n”;
}
6: Pointers, arrays and files 27
Linked list (cont)
C++
insertmid(’e’,3);
At first we add a new function insertmid
(char c, int pos), that takes a
character and an integer as arguments. The
new list element is inserted before the object
at position pos.
When a new element has to be inserted to
the list we have to
create the element first and
update the involved pointers.
It takes 3 steps and an extra helping pointer.
Implement this member functon as an extra
exercise
6: Pointers, arrays and files 28
Linked list (cont.)
C++
Next let us look at the function deleteNext(int pos):
Starting point
First step
Last step
Try to imagine how to implement this function, do
implement it, and test it .
6: Pointers, arrays and files 29
10.7 Details
C++
char** argv is the same as char * argv[ ]
The second notation is only only legal as parameter type
Memory management: new and delete
When an object is no longer needed… delete it!
Monday October 11th:
Chapter 11: "Defining abstract datatypes.
6: Pointers, arrays and files 30