280 likes | 357 Views
Pointers and References. CSCE 221H Texas A&M University. Pointers & Memory. 0x00. 0x04. 0x08. 0x0B. 0x10. 0x14. 0x18. 0x1B. 0x20. Pointers & Memory. int x = 5;. 0x00. 0x04. 0x08. 0x0B. 0x10. 0x14. 0x18. 0x1B. 0x20. 5. x. Pointers & Memory.
E N D
Pointers and References CSCE 221H Texas A&M University
Pointers & Memory 0x00 0x04 0x08 0x0B 0x10 0x14 0x18 0x1B 0x20
Pointers & Memory int x = 5; 0x00 0x04 0x08 0x0B 0x10 0x14 0x18 0x1B 0x20 5 x
Pointers & Memory operator ‘&’ takes the memory address of an object/variable int x = 5; int* y = &x 0x00 0x04 0x08 0x0B 0x10 0x14 0x18 0x1B 0x20 5 0x04 x y
Pointers & Memory int x = 5; int* y = &x int* z = y; 0x00 0x04 0x08 0x0B 0x10 0x14 0x18 0x1B 0x20 5 0x04 0x04 x y z
Pointers & Memory operator ‘*’ dereferences a pointer in memory to access the underlying object/data int x = 5; int* y = &x int* z = y; *z = 0; 0x00 0x04 0x08 0x0B 0x10 0x14 0x18 0x1B 0x20 0 0x04 0x04 x y z
Allocating memory using new Point *p = new Point(5, 5); • new can be thought of a function with slightly strange syntax • new allocates space to hold the object. • new calls the object’s constructor. • new returns a pointer to that object.
Deallocating memory using delete // allocate memory Point *p = new Point(5, 5); ... // free the memory delete p; For every call to new, there must be exactly one call to delete.
Using new with arrays int x = 10; int* nums1 = new int[10]; // ok int* nums2 = new int[x]; // ok • Dynamically allocates an array of 10 integers • C++ equivalent of the following C code int* nums = (int*)malloc(x * sizeof(int));
Using delete on arrays // allocate memory int* nums1 = new int[10]; int* nums3 = new int[x][4][5]; ... // free the memory delete[] nums1; delete[] nums3; • Have to use delete[].
Destructors • delete calls the object’s destructor. • delete frees the space occupied by an object. • A destructor cleans up after the object. • Releases resources such as memory, file handles, locks, etc.
Destructors – an Example class Segment { public: Segment(); virtual ~Segment(); private: Point *m_p0, *m_p1; };
Destructors – an Example Segment::Segment() { m_p0 = new Point(0, 0); m_p1 = new Point(1, 1); } Segment::~Segment() { if(m_p0) delete m_p0; if(m_p1) delete m_p1; }
Syntactic Sugar “->” Point *p = new Point(5, 5); // Access a member function: (*p).move(10, 10); // Or more simply: p->move(10, 10); Dereference the object then call one of its functions
Stack vs. Heap What happens when p goes out of scope?
Dynamic Memory (resizing an array) 1 2 3 4 5 6 7 S
Dynamic Memory (resizing an array) 1 2 3 4 5 6 7 S 0 0 0 0 0 0 0 0 0 0 0 0 0 0 T int* T = new int[2*n];
Dynamic Memory (resizing an array) 1 2 3 4 5 6 7 S 1 2 3 4 5 6 7 0 0 0 0 0 0 0 T for (i = 0 to n) T[i] = S[i];
Dynamic Memory (resizing an array) 1 2 3 4 5 6 7 S 1 2 3 4 5 6 7 0 0 0 0 0 0 0 T delete[] S;
Dynamic Memory (resizing an array) S 1 2 3 4 5 6 7 0 0 0 0 0 0 0 T S = T;
Passing by value void Math::square(int i) { i = i*i; } int main() { int i = 5; Math::square(i); cout << i << endl; } When passing by value, a copy is always induced in c++ (not so in c++11). Only pass ‘trivially-copyable’ objects by value, e.g., int, double, char.
Passing by reference void Math::square(int &i) { i = i*i; } int main() { int i = 5; Math::square(i); cout << i << endl; } When passing by reference, a copy of the memory address is passed into a function. Always pass large objects by reference, e.g., string, MyClass, vector<T>, etc.
What is a reference? • An alias – another name for an object. int x = 5; int &y = x; // y is a // reference to x y = 10;
Introducing: const void Math::printSquare(const int &i){ i = i*i; cout << i << endl; } int main() { int i = 5; Math::printSquare(i); Math::printCube(i); } Won’t compile. const means that the underlying data should not change. Only const functions can be called on const objects.
Can also pass pointers to const void Math::printSquare(const int *pi) { *pi = (*pi)*(*pi); cout << pi << endl; } int main() { int i = 5; Math::printSquare(&i); Math::printCube(&i); } Still won’t compile.
Declaring things const const River nile; const River* nilePc; River* const nileCp; const River* const nileCpc
Read pointer declarations right to left // A const River const River nile; // A pointer to a const River const River* nilePc; // A const pointer to a River River* constnileCp; // A const pointer to a const River const River* constnileCpc
Lab Assignment • Create a class called Point with two private data members, a public function Print, and constructors. • Statically allocate an array of 10 Points, initialize them with non-zero data, and print them. • Dynamically allocate an array of 10 Points, initialize them with non-zero data, and print them. • Loop through the second array using pointer arithmetic and print them again (hint p+1 is a pointer to the second element on the array)