Você está na página 1de 30

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

Você também pode gostar