230 likes | 239 Views
Learn how to comfortably use pointers, call functions by value or reference, and allocate and deallocate memory in CISC220 Lecture 02.
E N D
CISC220Spring 2010James Atlas Lecture 02: Pointers, Functions, Memory Management
Objectives for Today • Use Pointers comfortably • Call functions • by value, by reference • Allocate and de-allocate memory • Reading - K+W P.7-P
Location (address) 104 101 102 103 104 105 ... ... ... x y 23 42 name Pointers • An address refers to a particular memory location. In other words, it points to a memory location. • Pointer: A variable that contains the address of a variable. z
x y x y x y ? ? ? 3 3 Pointers • How to initialize a pointer: • can initialize to NULL (i.e. not currently pointing to anything) • &operator: get address of a variable int *x; int y = 3; x = &y;
x y x y 5 3 Pointers • How to get the value that is pointed to? • * "dereference operator”: get value pointed to • * x returns 3 • How to change the variable pointed to? • Use dereference * operator to left of = *x = 5;
Functions f x f(x)
Call-by-value int sum(int x, int y) { return x + y; } int main(void) { cout << sum(5,6) << endl; }
Call-by-reference int sum(const int& x, const int& y) { return x + y; } int main(void) { cout << sum(5,6) << endl; }
Memory Allocation • Two ways: • On the stack • On the heap
Memory Allocation (Stack) int main(void) { int x(5); if (x > 3) { int y(6); cout << (x + y) << endl; } }
Memory Allocation (Heap) int main(void) { int *x = new int(5); if (*x > 3) { int *y = new int(6); cout << (*x + *y) << endl; } }
Memory De-allocation (Heap) int main(void) { int *x = new int(5); if (*x > 3) { int *y = new int(6); cout << (*x + *y) << endl; delete y; } delete x; }
Array Allocation (Heap) int main(void) { int *x = new int[5]; *x = 5; if (*x > 3) { int *y = new int(6); cout << (*x + *y) << endl; delete y; } delete [] x; }
Group Review • Break into teams of 4-5 students • One person write an official answer • Swap answers with a neighboring group and keep scores!
Question 1 • What is output from the following code: double x = 5.5; double *px = &x; cout << *px << endl; *px = 10.0; cout << x << endl;
Question 2 • What is output from the following code: double x = 5.5; double y = 10.0; double* px, py; px = &x; py = &y; cout << *px << endl << *py << endl;
Question 3 • What is output from the following code: double x = 5.5; double *px = &x; *px = 3.14; double& r = *px; r = 99.44; cout << x << endl;
Question 4 • What is output from the following code: void swap(int x, int y) { int temp = x; x = y; y = temp; } int main(void) { int a = 0; int b = 5; swap(a,b); cout << a << endl; }
Question 5 • Change the code to work correctly using references: void swap(int x, int y) { int temp = x; x = y; y = temp; } int main(void) { int a = 0; int b = 5; swap(a,b); cout << a << endl; }
Question 6 • What is the value of temp after each assignment? char blocks[3] = {'A','B','C'}; char *ptr = &blocks[0]; char temp; /*1*/ temp = blocks[0]; /*2*/ temp = *(blocks + 2); /*3*/ temp = *(ptr + 1); ptr = blocks + 1; /*4*/ temp = *ptr; /*5*/ temp = *(ptr + 1);
Question 7 • What is the value of temp after each assignment? char blocks[3] = {'A','B','C'}; char *ptr = blocks; char temp; /*1*/ temp = *++ptr; /*2*/ temp = ++*ptr; /*3*/ temp = *ptr++; /*4*/ temp = *ptr;
Question 8 • Write code to reverse a string using only pointer arithmetic (no array accessors): int main(void) { char s[10] = "abcde"; for (int i = 0; s[i] != NULL; i++) { cout << s[i]; } reverseString(s); for (int i = 0; s[i] != NULL; i++) { cout << s[i]; } cout << endl; return 0; }
Question 9 • What is output from the following code? int *x, *y, *z; x = new int[20]; x[10] = 0; y = x; x[10] = 5; cout << x[10] << ", " << y[10] << endl; x[10] = 15; z = new int[10]; for (int i = 0; i < 10; i++) z[i] = x[i]; z[10] = 25; cout << x[10] << ", " << y[10] << ", " << z[10] << endl;