1 / 52

Engineering Problem Solving with C++, Etter/Ingber

Engineering Problem Solving with C++, Etter/Ingber. Chapter 9 An Introduction to Pointers. An Introduction to Pointers. Addresses and Pointers Pointers to Array Elements Dynamic Memory Allocation Data Structures and the STL. address operator pointer assignment pointer arithmetic.

Télécharger la présentation

Engineering Problem Solving with C++, Etter/Ingber

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Engineering Problem Solving with C++, Etter/Ingber Chapter 9 An Introduction to Pointers Engineering Problem Solving with C++, second edition, J. Ingber

  2. An Introduction to Pointers • Addresses and Pointers • Pointers to Array Elements • Dynamic Memory Allocation • Data Structures and the STL. Engineering Problem Solving with C++, second edition, J. Ingber

  3. address operator pointer assignment pointer arithmetic Addresses and pointers Engineering Problem Solving with C++, second edition, J. Ingber

  4. Addresses and Pointers • A pointer is an object that holds the memory address of another object. • If a variable p contains the address of another variable q, then p is said to point to q. • If q is a variable at location 100 in memory, then p would have the value 100 (q’s address). • Memory snapshot: p q Engineering Problem Solving with C++, second edition, J. Ingber

  5. Address Operator • The operator & is called the address operator. • When the & operator is applied to an object, the result is the address of the object. • Example: int x=75; cout << "x is " << x; cout << "\ntheaddres of x is " << &x; x [0x7fff8164] 75 OUTPUT: x is 75 the address of x is 0x7fff8164 Engineering Problem Solving with C++, second edition, J. Ingber

  6. Pointer Assignment • Pointer types are declared using the pointer operator*, also called the dereferencing operator. • Syntax - • type *variable_name, *variable_name; • type* variable_name; • When declaring more than one pointer variable, the * operator must precede each identifier. Engineering Problem Solving with C++, second edition, J. Ingber

  7. Example int *iPtr; double* dPtr; • The variable iPtr is declared to be of type pointer to int. • The variable dPtr is declared to be of type pointer to double. • Neither variable in this example has been initialized. iPtr dPtr ? ? Engineering Problem Solving with C++, second edition, J. Ingber

  8. Example int *iPtr, i=6;char* s, str[] = "example";double *dPtr, d=1.25; iPtr s dPtr i str d 6 "example" 1.25 Engineering Problem Solving with C++, second edition, J. Ingber

  9. Initialization and Assignment • Pointer types may be initialized at the time they are declared. • Pointer types may be assigned new values using the assignment operator. Engineering Problem Solving with C++, second edition, J. Ingber

  10. Example – Initial Pointers to NULL int *iPtr=0; char *s=NULL; //predefined constant in iostream double *dPtr=NULL; iPtr s dPtr Engineering Problem Solving with C++, second edition, J. Ingber

  11. x xp ip Assignment • The assignment operator (=) is defined for pointers of the same base type. • The right operand of the assignment operator can be any expression that evaluates to the same type as the left operand. Example: int x, *xp, *ip; xp = &x; ip = xp; Engineering Problem Solving with C++, second edition, J. Ingber

  12. The Base Type • The base type of a pointer refers to the type of object the pointer is referencing. • The base type of a pointer defines the size of the object the pointer is referencing. • The size of a pointer is independent of its base type. • p and q are the same ( 4 bytes**), but p points to 4 bytes** and q points to 8 bytes** **compiler dependent Engineering Problem Solving with C++, second edition, J. Ingber

  13. Example: int p(5), *iPtr=&p; double q, *dPtr=&q; p iPtr 5 dPtr q ? ? • sizeof p is 4 • sizeof q is 8 • sizeof iPtr is 4 • sizeof dPtr is 4 Engineering Problem Solving with C++, second edition, J. Ingber

  14. Base Type • A pointers base type determines how the object referenced by the pointer will be interpreted. • The declaration: int *p; declares p to be a pointer to int. What ever p points to will be interpreted as an int, ie 4 bytes. • Base type also defines pointer arithmetic. Engineering Problem Solving with C++, second edition, J. Ingber

  15. Pointer Arithmetic • Four arithmetic operations are supported: +, -, ++, -- • Arithmetic is performed relative to the base type of the pointer. • When applied to pointers, ++ means increment pointer to point to next object. Example:p++; • if p is defined as int *p, p will be incremented by 4 (bytes). • if p is defined as double *p, p will be incremented by 8(bytes). Engineering Problem Solving with C++, second edition, J. Ingber

  16. Example int *p; cout << "size of char is " << sizeof(char) << endl; cout << "size of int is " << sizeof(int) << endl; cout << "size of double is " << sizeof(double) << endl; cout << "size of float is " << sizeof(float) << endl; cout << "the size of p is " << sizeof(p) << endl; Output: size of char is 1 size of int is 4 size of double is 8 size of float is 4 the size of p is 4 Engineering Problem Solving with C++, second edition, J. Ingber

  17. Practice! int q=6; int *iPtr = &q; cout << "iPtr is " << iPtr << endl; cout << "*iPtr is " << *iPtr << endl; cout << "++*iPtr, is " << ++*iPtr << endl; cout << "q is " << q << endl; cout << "iPtr is " << iPtr << endl; cout << "*iPtr++ is " << *iPtr++ << endl; cout << "iPtr is " << iPtr << endl; cout << "q is " << q << endl; Complete the output: iPtr is 0x7fff2f14 Engineering Problem Solving with C++, second edition, J. Ingber

  18. Result of Practice iPtr is 0x7fff2f14 *iPtr is 6 ++*iPtr is 7 q is 7 iPtr is 0x7fff2f14 *iPtr++ is 7 iPtr is 0x7fff2f18 q is 7 Engineering Problem Solving with C++, second edition, J. Ingber

  19. Comparing Pointers • You may compare pointers using relational operators • Common comparisons are: • check for null pointer (p == NULL) • Note: since NULL evaluates as false, and any other pointer evaluates as true, checking for a null pointer can be done as (!p) • check if two pointers are pointing to the same object (p == q) • Note: (*p == *q) means they are pointing to equivalent, but not necessarily the same data. Engineering Problem Solving with C++, second edition, J. Ingber

  20. one-dimensional arrays pointers as arguments to functions Pointers to Array Elements Engineering Problem Solving with C++, second edition, J. Ingber

  21. One Dimensional Arrays • The name of an array is the address of the first element (i.e. a pointer to the first element). • Arrays and pointers may often be used interchangeably. Example int num[4] = {1,2,3,4}, *p; p = num; //same as p = &num[0]; cout << *p <<endl; ++p; cout << *p; output: 1 2 Engineering Problem Solving with C++, second edition, J. Ingber

  22. Arrays and Pointers • You can index a pointer using [] operator. Example: char myString[] = "This is a string"; char *str; str = myString; for(int i =0; str[i]; i++) //look for null cout << str[i]; What does this segment print? This is a string Engineering Problem Solving with C++, second edition, J. Ingber

  23. Arrays and Pointers • When an array is defined, memory is allocated according to the specified size of the array. • The name of an array is a pointer to the first element. However, the value of the pointer can not be changed. It will always point to the same memory location. • When a pointer is defined, 4 bytes* are allocated to store a memory address. • The value assigned to a pointer can be modified (reassigned to point to a different object). Engineering Problem Solving with C++, second edition, J. Ingber

  24. 0xfff4c252 myString T h i s i s a s t r i n g \0 strPtr 0xfff4c252 Practice! What does this print? char myString[ ] = "This is a string"; char *strPtr; strPtr = myString; cout << *myString << endl; cout<<myString << endl; cout << *(myString + 1) << endl; strPtr++; cout << *++strPtr << endl; myString++; //not legal T This is a string h i Engineering Problem Solving with C++, second edition, J. Ingber

  25. Arrays of Pointers • You may define arrays of pointers like any other data type in C++ int num=8; //declare an array of 10 pointers to int int *iPtrs[10]; //first element is assigned a value iPtrs[0] = &num; //output the value of num cout << *iPtrs[0]; Engineering Problem Solving with C++, second edition, J. Ingber

  26. Pointers As Arguments to Functions • Pointers may be passed either "by value" or "by reference". • In either case, the pointer can be used to modify the object to which it is pointing. • Only when passed by reference can the pointer argument itself be modified. Engineering Problem Solving with C++, second edition, J. Ingber

  27. Common Pointer Problems • Using uninitialized pointers int *iPtr; *iPtr = 100; iPtr has not been initialized. The value 100 will be assigned to some memory location. Which one determines the error. • Failing to reset a pointer after altering it’s value. • Incorrect/unintended syntax. Engineering Problem Solving with C++, second edition, J. Ingber

  28. Practice! • #include <iostream> • int main() • { char *aString = "What happens here?"; • int len=0; • while(*aString++ != '\0') • len++; • std::cout << len << ": " << aString; • return 0; • } • Does this compile? If not, why? • If it does, what is the output? Explain? Yes 18: Engineering Problem Solving with C++, second edition, J. Ingber

  29. new delete dynamically allocated arrays Dynamic memory allocation Engineering Problem Solving with C++, second edition, J. Ingber

  30. Stack Heap Global data Program code Dynamic Allocation Using new and delete • Storage for data is allocated as needed from the free memory area known as the heap. • Run-time stack • Local variables • Formal parameters • Managed by the compiler • Heap • Dynamic storage • Managed by storage allocator Engineering Problem Solving with C++, second edition, J. Ingber

  31. Dynamic Memory Allocation • Dynamically allocated memory is defined at runtime. • Dynamic allocation of memory allows for more efficient use of a finite resource. • Dynamic allocation is often used to support dynamic data structures such as stacks, queues, linked lists and binary trees. • Dynamically allocated memory should be freed during execution when it is no longer needed. Engineering Problem Solving with C++, second edition, J. Ingber

  32. Operator new • Replaces malloc() used in C • Allocates a block of memory from the heap. • Returns the address of the first byte. • If allocation fails, new throws and exception that terminates the program (or returns NULL on older compilers). Engineering Problem Solving with C++, second edition, J. Ingber

  33. Example int *iPtr; iPtr = new int; // 4 bytes are allocated // iPtr points to 1st byte double *dPtr; dPtr = new double[20]; // 160 bytes allocated // dPtr points to 1st byte iPtr dPtr heap Engineering Problem Solving with C++, second edition, J. Ingber

  34. Initializing Dynamically Allocated Memory • To initialize a dynamically allocated object, the initial value is provided inside parentheses following the type. • Example: int *ptr; ptr = new int(100); //4 bytes allocated //initial value: 100 Engineering Problem Solving with C++, second edition, J. Ingber

  35. Practice: • int main() • { • int *iPtr, *jPtr, i; • iPtr = new int; • jPtr = new int(3); • double *dPtr; • dPtr = new double[6]; • *iPtr = 7; • cout << *iPtr << ',' << *jPtr << endl; • for(i=0; i<6; i++) • dPtr[i] = 5; • for(i=0; i<6; i++) • cout << (*dPtr)++ << ' '; • cout << endl; • for(i=0; i<6; i++) • cout << dPtr[i] << ' '; • return 0; • } OUTPUT 7 , 3 5 6 7 8 9 10 11 5 5 5 5 5 EXPLAIN Engineering Problem Solving with C++, second edition, J. Ingber

  36. Operatordelete • Replaces free() used in C. • The delete operator frees memory allocated by new. • Using delete to attempt to free any other type of address will result in errors. Engineering Problem Solving with C++, second edition, J. Ingber

  37. 100 delete Example int *ptr; ptr = new int (100); cout << *ptr; //see if it worked ptr delete ptr; //free the memory ptr ? value of ptr is now undefined Engineering Problem Solving with C++, second edition, J. Ingber

  38. Example: Dynamically Allocated Arrays double *dptr; const int SIZE = 10; dptr = new double[SIZE];//80 bytes for(int i=0; i<SIZE; ++i) cin >> dptr[i]; fun1(dptr, SIZE); // pass array to fun1 delete [] dptr; //free all 10 elements Engineering Problem Solving with C++, second edition, J. Ingber

  39. Example using delete • int main() • { • int *iPtr, *jPtr; • iPtr = new int(2); • jPtr = new int(3); • cout << *iPtr << ',' << *jPtr << endl; • delete iPtr; • delete jPtr; • cout << *iPtr << ',' << *jPtr << endl; • int *dPtr; • dPtr = new int(5); • cout << iPtr << ',' << jPtr << endl; • cout << *iPtr << ',' << *jPtr << endl; • cout << dPtr << endl; • return; • } • What output would you expect from this code? Engineering Problem Solving with C++, second edition, J. Ingber

  40. list stack queue Data structures and the STL Engineering Problem Solving with C++, second edition, J. Ingber

  41. List • A list is a data structure organized as a collection of elements, or nodes, that are linked by pointers. • Elements can be added at any position in a list in constant time by reassigning pointers. • List have many useful applications in the organization large amounts of data. Engineering Problem Solving with C++, second edition, J. Ingber

  42. The list class • list is a class template defined in the header file list. #include<list> list<string> word; //list of strings Engineering Problem Solving with C++, second edition, J. Ingber

  43. list Methods • Elements can be added to and removed from any position in a list using the appropriate method and an iterator. • An iterator is similar to a pointer, but is usually implemented as a class object. • Common Methods: bool empty() iterator insert() iterator remove() iterator begin() iterator end() Engineering Problem Solving with C++, second edition, J. Ingber

  44. Example list<string> wordList; list<string>::iterator iter = wordList.begin(); iter = wordList.insert(iter,"hello"); wordList.insert(iter,"world"); for(iter=wordList.begin(); iter!= wordList.end(); iter++) cout << *iter << " "; output: hello world Engineering Problem Solving with C++, second edition, J. Ingber

  45. Queue • A queue is known as a first-in-first-out (FIFO) data structure. • Items are added to the end of a queue and removed from the front of the queue. • Queues have many useful applications, including processing requests. Engineering Problem Solving with C++, second edition, J. Ingber

  46. The queue class • queue is a class template defined in the header file queue. #include<queue> queue<int> printIDs; //queue of ints Engineering Problem Solving with C++, second edition, J. Ingber

  47. queue Methods bool empty() void pop()//remove from front void push()//add to end data-type front()//return front data-type back()//return end Engineering Problem Solving with C++, second edition, J. Ingber

  48. Example #include<queue> … queue<int> theQueue; theQueue.push(10); theQueue.push(20); cout << theQueue.front(); //output 10 cout << theQueue.back(); //output 20 Engineering Problem Solving with C++, second edition, J. Ingber

  49. Stack • A stack is known as a last-in-first-out (LIFO) data structure. • Items are added to and removed from the top of the stack. • Stacks are essential in the design of compilers and for implementing recursion. Engineering Problem Solving with C++, second edition, J. Ingber

  50. The stack class • stack is a class template defined in the header file stack. #include<stack> stack<int> theStack; //stack of ints Engineering Problem Solving with C++, second edition, J. Ingber

More Related