0% found this document useful (0 votes)
153 views27 pages

CP - Pointers

- Pointers store the memory address of another variable. They allow indirect access to the value stored at a particular memory location. - Arrays can decay into pointers to their first element. The name of an array represents the address of its first element. Pointer arithmetic can be used to index into an array using a pointer. - References are alternative names for existing variables that allow pass by reference. They are commonly used as parameters to avoid copying large objects. References cannot be reassigned once initialized.

Uploaded by

Habib ur rehman
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
153 views27 pages

CP - Pointers

- Pointers store the memory address of another variable. They allow indirect access to the value stored at a particular memory location. - Arrays can decay into pointers to their first element. The name of an array represents the address of its first element. Pointer arithmetic can be used to index into an array using a pointer. - References are alternative names for existing variables that allow pass by reference. They are commonly used as parameters to avoid copying large objects. References cannot be reassigned once initialized.

Uploaded by

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

COMPUTER PROGRAMMING

POINTERS
Topics
• Pointers
• Memory addresses
• Declaration
• Dereferencing a pointer
• Pointers to pointer

• Static vs. dynamic objects


• new and delete
Computer Memory
• Each variable is assigned a memory slot (the size depends on the data
type) and the variable’s data is stored there

Memory address: 1020 1024 1032

… … 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

Memory address: 1020 1024 1032

… … 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


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 … … …
int a = 100; a
//get the value,
cout << a; //prints 100
//get the memory address
cout << &a; //prints 1024
Address Operator (&)
Memory address: 1020 1024 1032
#include <iostream>
using namespace std;
… 88 100 … … …
a b
void main(){ Result is:
int a, b; The address of a is: 1020
a = 88; The address of b is: 1024

b = 100;
cout << "The address of a is: " << &a << endl;
cout << "The address of b is: " << &b << endl;
}
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
Pointer to Pointer
What is the output?

58 58 58
Dereferencing Operator *
• We can access to the value stored in the variable pointed to by using
the dereferencing 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
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 What is the output?
p2 = p1; // p2 points to a
b = *p3; //assign c to b 888
*p2 = *p3; //assign c to a
cout << a << b << c;
A Pointer Example
void doubleIt(int x,int * p){

*p = 2 * x;
Box diagram Memory Layout
main
}

int main(int argc, const char * argv[])


p 8192
a 16 (8200)
{ doubleIt
int a = 16; x 9
(8196)
doubleIt(9, &a);

return 0; a 16 main
doubleIt (8192)
}

x 9

a gets 18 p
Another Pointer Example
#include <iostream>
using namespace std;int main (){
What is
int value1 = 5, value2 = 15;
int *p1, *p2;
value1?
p1 = &value1; // p1 = address of value1 value2?
p2 = &value2; // p2 = address of value2 p1=?
*p1 = 10; // value pointed to by p1=10 p2=?
*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;
}
Reference Variables
A reference is an additional name to
an existing memory location
Pointer: Reference:

x 9 x
9
ref

int x = 9;
ref int &ref = x;

int x=9;
int *ref;
ref = &x;
Reference Variables
• A reference variable serves as an alternative name for an object

int m = 10;
int &j = m; // j is a reference variable
cout << “value of m = “ << m << endl; //print 10
j = 18;
cout << “value of m = “ << m << endl; // print 18
Reference Variables
• A reference variable always refers to the same object. Assigning a reference variable with a
new value actually changes the value of the referred object.
• Reference .variables are commonly used for parameter passing to a function
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;

void main (){


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
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>
p using namespace std;
a
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
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

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


Note: flexible pointer syntax
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
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!

You might also like