Pointers Old
Pointers Old
AND
DYNAMIC OBJECTS
Topics
Pointers
◦ Memory addresses
◦ Declaration
◦ Dereferencing a pointer
◦ Pointers to pointer
… … 100 … 1024 …
a
Variable a’s value, i.e., 100, is
int a = 100; stored at memory location 1024
Pointers
A pointer is a variable used to store the address of a memory cell.
We can use the pointer to reference this memory cell
… … 100 … 1024 …
integer
pointer
Pointer Types
Pointer
◦ C++ has pointer types for each type of object
◦ Pointers to int objects
◦ Pointers to char objects
◦ Pointers to user-defined objects
(e.g., RationalNumber)
◦ Even pointers to pointers
◦ Pointers to pointers to int objects
Pointer Variable
Declaration of Pointer variables
type* pointer_name;
//or
type *pointer_name;
where type is the type of data pointed to (e.g. int, char, double)
Examples:
int *n;
RationalNumber *r;
int **p; // pointer to pointer
Address Operator &
The "address of " operator (&) gives the memory address of the
variable
◦ Usage: &variable_name
Memory address: 1020 1024
… … 100 … … …
a
int a = 100;
//get the value,
cout << a; //prints 100
//get the memory address
cout << &a; //prints 1024
Address Operator &
Memory address: 1020 1024 1032
… 88 100 … … …
a b
#include <iostream>
using namespace std;
Result is:
void main(){ The address of a is: 1020
int a, b; The address of b is: 1024
a = 88;
b = 100;
cout << "The address of a is: " << &a << endl;
cout << "The address of b is: " << &b << endl;
}
Pointer Variables
… 88 100 … 1024 …
a p
int a = 100; Result is:
int *p = &a; 100 1024
cout << a << " " << &a <<endl; 1024 1032
cout << p << " " << &p <<endl;
58 58 58
Dereferencing Operator
*
We can access to the value stored in the variable pointed to by using the
dereferencing operator (*),
… 88 100 … 1024 …
a p
int a = 100;
Result is:
int *p = &a;
cout << a << endl; 100
cout << &a << endl; 1024
cout << p << " " << *p << endl; 1024 100
cout << &p << endl; 1032
Don’t get confused
Declaring a pointer means only that it is a pointer: int *p;
Don’t be confused with the dereferencing operator, which is also
written with an asterisk (*). They are simply two different tasks
represented with the same sign
int a = 100, b = 88, c = 8;
int *p1 = &a, *p2, *p3 = &c;
p2 = &b; // p2 points to b
p2 = p1; // p2 points to a Result is:
b = *p3; //assign c to b 888
*p2 = *p3; //assign c to a
cout << a << b << c;
A Pointer Example
Memory Layout
The code
Box diagram
main
void doubleIt(int x,
int * p) p
a 16 8192
{ (8200)
*p = 2 * x;
doubleIt
x 9
} (8196)
int main(int argc, const
char * argv[]) a 16 main
{
doubleIt (8192)
int a = 16;
x 9
doubleIt(9, &a);
a gets 18
return 0;
p
}
Another Pointer
Example
#include <iostream> Let’s figure out:
using namespace std; value1==? / value2==?
int main (){
Also, p1=? p2=?
int value1 = 5, value2 = 15;
int *p1, *p2;
p1 = &value1; // p1 = address of value1
p2 = &value2; // p2 = address of value2
*p1 = 10; // value pointed to by p1=10
*p2 = *p1; // value pointed to by p2= value // pointed to by p1
p1 = p2; // p1 = p2 (pointer value copied)
*p1 = 20; // value pointed to by p1 = 20
cout << "value1==" << value1 << "/ value2==" << value2;
return 0;
}
Another Pointer
Example
int a = 3;
char s = ‘z’;
double d = 1.03;
int *pa = &a;
char *ps = &s;
double *pd = &d;
% sizeof returns the # of bytes…
cout << sizeof(pa) << sizeof(*pa)
<< sizeof(&pa) << endl;
cout << sizeof(ps) << sizeof(*ps)
<< sizeof(&ps) << endl;
cout << sizeof(pd) << sizeof(*pd)
<< sizeof(&pd) << endl;
Traditional Pointer
Usage
void IndirectSwap(char *Ptr1, char *Ptr2){
char temp = *Ptr1;
*Ptr1 = *Ptr2;
*Ptr2 = temp;
}
int main() {
char a = 'y';
char b = 'n';
IndirectSwap(&a, &b);
cout << a << b << endl;
return 0;
}
Pass by Reference
void IndirectSwap(char& y, char& z) {
char temp = y;
y = z;
z = temp;
}
int main() {
char a = 'y';
char b = 'n';
IndirectSwap(a, b);
cout << a << b << endl;
return 0;
}
Pointers and Arrays
The name of an array points only to the first
element not the whole array.
1000
1004
1008
1012
1016
Array Name is a pointer constant
#include <iostream>
using namespace std;
Result:
Address of a[0]: 0x0065FDE4
Name as pointer: 0x0065FDE4
Dereferencing An Array Name
This element is
called a[0] or
*a
#include <iostream>
a[0] 2 using namespace std;
a void main(){
a[1] 4 int a[5] = {2,4,6,8,22};
a[2] 6 cout << *a << " "
<< a[0];
a[3] 8 } //main
a[4] 22
a
Array Names as Pointers
To access an array, any pointer to the first element
can be used instead of the name of the array.
We could replace *p by *a
#include <iostream>
a p using namespace std;
void main(){
a[0] 2 int a[5] = {2,4,6,8,22};
22
a[1] 4 int *p = a;
a[2] 6 cout << a[0] << " "
a[3] 8 << *p;
a[4] 22 }
a
Multiple Array Pointers
Both a and p are pointers to the same array.
#include <iostream>
a[0] using namespace std;
a[0] 22 void main(){
2 p
44 int a[5] = {2,4,6,8,22};
a[1] 4 int *p = &a[1];
a[2] 6 cout << a[0] << " "
<< p[-1];
a[3] 8 p[0]
cout << a[1] << " "
a[4] 22 << p[0];
}
Pointer Arithmetic
Given a pointer p, p+n refers to the element that
is offset from p by n positions.
a 2 p - 1
a + 1 4 p
a + 2 6 p + 1
a + 3 8 p + 2
a + 4 22 p + 3
Dereferencing Array Pointers
a[0] or *(a + 0) 2 a
a[1] or *(a + 1) 4 a + 1
a[2] or *(a + 2) 6 a + 2
a[3] or *(a + 3) 8 a + 3
a[4] or *(a + 4) 22 a + 4
int oned[12];
for(int i=0; i<3; i++){
for(int j=0; j<4 ; j++)
oned[i*4+j] = twod[i][j];
}
Pointer to 2-Dimensional Arrays
table table[i] =
&table[i][0]
refers to
table + 1 table[ 0] or *( table + 0 ) the address
of the ith
row
table + 2 table[ 1] or *( table + 1 )
table[ 2] or *( table + 2 )
int table[3][4] = {{1,2,3,4}, *(table[i]+j)
What is = table[i][j]
{5,6,7,8},{9,10,11,12}};
**table
? for(int i=0; i<3; i++){
for(int j=0; j<4; j++)
cout << *(*(table+i)+j);
cout << endl;
}
DYNAMI
C
OBJECTS
Memory Management
Static Memory Allocation
◦ Memory is allocated at compilation time
Dynamic Memory
◦ Memory is allocated at running time
Static vs. Dynamic
Objects
Static object Dynamic object
new
delete
{ int* ptr;
int a[200]; ptr = new int[200];
… …
} delete [] ptr;
Object (variable) creation:
New
Syntax
ptr = new SomeType;
Example
int* p = new int;
p
Object (variable) destruction: Delete
Syntax
delete p;
storage pointed to by p is returned to free store and p is now
undefined
Example
int* p = new int;
*p = 10;
delete p;
p 10
Array of New:
dynamic arrays
Syntax
P = new SomeType[Expression];
◦ Where
◦ P is a pointer of type SomeType
◦ Expression is the number of objects to be constructed -- we are making an array
new
int *p, n=10; p
p = new int;
new
p = new int[100];
p
new
p = new int[n]; p
Memory Allocation Example
Want an array of unknown size
#include <iostream>
using namespace std;
void main()
{
int n;
cout << “How many students? “;
cin >> n;
int *grades = new int[n];
for(int i=0; i < n; i++){
int mark;
cout << “Input Grade for Student” << (i+1) << “ ? :”;
cin >> mark;
grades[i] = mark;
}
. . .
printMean( grades, n ); // call a function with dynamic array
. . .
}
Freeing (or deleting) Memory
Dangling Pointer Problem
int *A = new int[5];
for(int i=0; i<5; i++)
A[i] = i;
int *B = A;
A
0 1 2 3 4
B
delete [] A;
Locations do not belong to program
B[0] = 1; // illegal!
A —
?
B
Memory Leak Problem
int *A = new int [5];
for(int i=0; i<5; i++)
A[i] = i;
A 0 1 2 2 3 4
A 0 1 2 3 4
— — — — —
A Dynamic 2D Array
A dynamic array is table
an array of pointers 32 18 12 24
to save space when table[0]
not all rows of the table[1] 13 11 16 12 42 19 14
array are full. table[2]
22
table[3]
int **table; table[4] 13 13 14
table[5]
11 18
table = new int*[6];
…
table[0] = new int[4];
table[1] = new int[7];
table[2] = new int[1];
table[3] = new int[3];
table[4] = new int[2];
table[5] = NULL;
Memory Allocation
int **table;
nt m, n; int m, n;
cin >> m >> n >> endl;
in >> m >> n >> endl;
int** mat;
mat = imatrix(m,n);
nt** mat; …
Rational *rp;
int a, b;
cin >> a >> b;
rp = new Rational(a,b);
(*rp).Display(); // rp->Display();
delete rp;
rp = NULL;