100% found this document useful (1 vote)
135 views28 pages

Pointers Review

Pointers allow programs to indirectly reference and manipulate values in memory. A pointer stores the address of a memory location that can be used to access the value stored at that location. Pointer variables are declared with a type followed by an asterisk, such as int* pointer, and can be assigned the address of another variable using the address of operator &. The value stored at the address pointed to by a pointer is accessed using the dereference operator *. Arrays are stored contiguously in memory, and the name of an array is a constant pointer to the first element of the array.

Uploaded by

Sello Hlabeli
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
135 views28 pages

Pointers Review

Pointers allow programs to indirectly reference and manipulate values in memory. A pointer stores the address of a memory location that can be used to access the value stored at that location. Pointer variables are declared with a type followed by an asterisk, such as int* pointer, and can be assigned the address of another variable using the address of operator &. The value stored at the address pointed to by a pointer is accessed using the dereference operator *. Arrays are stored contiguously in memory, and the name of an array is a constant pointer to the first element of the array.

Uploaded by

Sello Hlabeli
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 28

Pointers

COMP104 Pointers / Slide 2

Pointers

A pointer is a variable used for storing the


address of a memory cell.
We can use the pointer to reference this
memory cell

Memory address: 1020 1024 1032

100 1024
integer pointer
COMP104 Pointers / Slide 3

Computer Memory
A variable is in fact a portion of memory to
store a determined value
Each variable is assigned a memory slot (the
size depends on the data type) and the
variables data is stored there

Memory address: 1020 1024 1032

100 1024
a
Variable as value, i.e., 100, is
int a = 100; stored at memory location 1024
COMP104 Pointers / Slide 4

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
COMP104 Pointers / Slide 5

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;
//To get the value, use the variable name
cout << a; //prints 100
//To get the memory address, add the address
//operator before the variable name
cout << &a; //prints 1024
COMP104 Pointers / Slide 6

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;
}
COMP104 Pointers / Slide 7

Pointer Variable

A pointer variable is a specific box for storing


a memory address
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)
COMP104 Pointers / Slide 8

Pointer Variables
Memory address: 1020 1024 1032

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;

The value of pointer p is the address of variable a


A pointer is also a variable, so it has its own memory
address
COMP104 Pointers / Slide 9

Reference Operator *
We can access to the value stored in the variable
pointed to by preceding the pointer with the star
reference operator (*),
Memory address: 1020 1024 1032

88 100 1024
a p
int a = 100;
int *p = &a; Result is:
cout << a << endl; 100
cout << &a << endl; 1024
cout << p << " " << *p << endl; 1024 100
cout << &p << endl; 1032
COMP104 Pointers / Slide 10

Dont get confused


Declaring a pointer means only that it is a pointer:
int *p;
Dont be confused with the reference 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
b = *p3; //assign c to b Result is:
*p2 = *p3; //assign c to a 888
cout << a << b << c;
COMP104 Pointers / Slide 11

Pointer Example
#include <iostream> Result is
using namespace std;
value1==10 / value2==20
int main (){
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;
}
COMP104 Pointers / Slide 12

Another Pointer Example


int a = 3;
char s = z;
double d = 1.03;
int *pa = &a;
char *ps = &s;
double *pd = &d;
cout << sizeof(pa) << sizeof(*pa)
<< sizeof(&pa) << endl;
cout << sizeof(ps) << sizeof(*ps)
<< sizeof(&ps) << endl;
cout << sizeof(pd) << sizeof(*pd)
<< sizeof(&pd) << endl;
COMP104 Pointers / Slide 13

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;
}
COMP104 Pointers / Slide 14

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;
}
COMP104 Pointers / Slide 15
Alternative
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;
}
COMP104 Pointers / Slide 16

Pointer to Pointer

What is the output?

58 58 58
COMP104 Pointers / Slide 17

More Pointer to Pointer


a p q r s
58 345670 445670 545670 645670
integer a; Pointer to Pointer to Pointer to Pointer to
integer Pointer to Pointer to Pointer to
integer pointer to pointer to
integer Pointer to
int a = 58; integer

int *p = &a;
int **q = &p;
int ***r = &q;
int ****s = &r;
q = &a //illegal!
s = &q //illegal!
COMP104 Pointers / Slide 18

Pointers and Arrays


The name of an array points only to the first
element not the whole array.

1000

1004

1008

1012

1016
COMP104 Pointers / Slide 19

Array Name is a pointer constant


#include <iostream>
using namespace std;

void main (){


// Demonstrate array name is a pointer constant
int a[5];
cout << "Address of a[0]: " << &a[0] << endl
<< "Name as pointer: " << a << endl;
}

/* result:
Address of a[0]: 0x0065FDE4
Name as pointer: 0x0065FDE4
*/
COMP104 Pointers / Slide 20

Dereference of An Array Name

This element is
called a[0] or
*a #include <iostream>
using namespace std;
a[0] void main(){ 222
2
int a[5] = {2,4,6,8,22};
a[1] 4 a cout << *a << " "
a[2] << a[0] << " "
6
<< *(&a[0]);
a[3] 8 } //main
a[4] 22

a
COMP104 Pointers / Slide 21

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>
using namespace std;
a p void main(){
int a[5] = {2,4,6,8,22}; 22
a[0] 2
int *p = a;
a[1] 4
int i = 0;
a[2] 6
cout << a[i] << " "
a[3] 8 << *p;
a[4] 22 }
a
COMP104 Pointers / Slide 22

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];
}
COMP104 Pointers / Slide 23

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
COMP104 Pointers / Slide 24

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

*(a+n) is identical to a[n]


COMP104 Pointers / Slide 25

Array of Pointers & Pointers to Array


a
p
b
c

An array of Pointers A pointer to an array


int a = 1, b = 2, c = 3; int list[5] = {9, 8, 7, 6, 5};
int *p[5]; int *p;
p[0] = &a; P = list;//points to 1st entry
p[1] = &b; P = &list[0];//points to 1st entry
p[2] = &c; P = &list[1];//points to 2nd entry
P = list + 1; //points to 2nd entry
COMP104 Pointers / Slide 26

NULL pointer
NULL is a special value that indicates an empty pointer
If you try to access a NULL pointer, you will get an error
int *p;
p = 0;
cout << p << endl; //prints 0
cout << &p << endl;//prints address of p
cout << *p << endl;//Error!
COMP104 Pointers / Slide 27

Storing 2D Array in 1D Array

int twod[3][4] = {{0,1,2,3}, {4,5,6,7},


{8,9,10,11}};
int oned[12];
for(int i=0; i<3; i++){
for(int j=0; j<4 ; j++)
oned[i*4+j] = twod[i][j];
}
COMP104 Pointers / Slide 28

Pointer to 2-Dimensional Arrays


table

table + 1 table[ 0] or *( table + 0 )

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 {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;
}

You might also like