Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
48 views53 pages

Data Structures: Lecture 3: Pointer

This document provides an overview of pointers in C++. It defines pointers as variables that store memory addresses and explains how they allow indirect access to values in memory. Key points include: - Pointers must be declared before use and are declared using an asterisk. - They can be assigned memory addresses using the address of operator (&). - The dereference operator (*) accesses the value at the memory address stored in the pointer. - Pointers enable passing variables to functions by reference and are essential for building complex data structures like linked lists.

Uploaded by

Hard Fucker
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
0% found this document useful (0 votes)
48 views53 pages

Data Structures: Lecture 3: Pointer

This document provides an overview of pointers in C++. It defines pointers as variables that store memory addresses and explains how they allow indirect access to values in memory. Key points include: - Pointers must be declared before use and are declared using an asterisk. - They can be assigned memory addresses using the address of operator (&). - The dereference operator (*) accesses the value at the memory address stored in the pointer. - Pointers enable passing variables to functions by reference and are essential for building complex data structures like linked lists.

Uploaded by

Hard Fucker
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/ 53

CSC 2105 Data Structures

Lecture 3: Pointer
Pointers

– Powerful feature of the C++ language

– Essential for construction of interesting data


structures

2
&

• The address of a memory location is called a pointer.


• Every variable is assigned a memory location whose address
of this memory location can be retrieved using address
operator & of C++.

Following figure shows their memory arrangement and addresses:


&letter is 1200 , &number is 1201, &amount is 1203
Example
#include <iostream.h>
value FFF0 56.47
void main( ) FFF1
{ FFF2
int data = 100;
float value = 56.47; FFF3
cout << data << &data << endl; data FFF4 100

cout << value << &value << endl; FFF5


} FFF6

Output:
100 FFF4
56.47 FFF0
OR

Like any variable or constant, you must declare a pointer before you can use it
to store any variable address.
Declaration of Pointer Variables
Type *pointerVarName;
– The * before the pointerVarName indicates that this
is a pointer variable, not a regular variable

– The * is not a part of the pointer variable name

Some valid pointer declaration:


int *inp; // pointer to an integer
char *chp // pointer to a character
double *dp; // pointer to a double
float *flp; // pointer to a float
The pointer data type
 A data type for containing an address (hexadecimal
number ) rather than a data value

 Provides indirect access to values

 The actual data type of the value of all pointers,


(integer, float, character) is the same, a long
hexadecimal number that represents a memory
address.

 The only difference between pointers of different data


types is the data type of the variable that the pointer
points to.
Declaration of Pointer Variables (Cont ..)
• Whitespace doesn‘t matter and
• each of the following will declare
– ptr as a pointer (to a float) variable and
– data as a float variable

float *ptr, data;


float* ptr, data;
float (*ptr), data;
float data, *ptr;
Assignment of Pointer Variables
• A pointer variable has to be assigned a valid
memory address before it can be used in the
program
• Example:
float data = 50.8;
float *ptr;
ptr = &data;
– This will assign the address of the memory
location allocated for the floating point
variable data to the pointer variable ptr.

– This is valid, since the variable data has


already been allocated some memory space
having a valid address
Assignment of Pointer Variables (Cont
..)

FFF0
FFF1
float data = 50.8; FFF2
float *ptr;
FFF3
ptr = &data;
data FFF4 50.8
FFF5
FFF6

10
Assignment of Pointer Variables (Cont
..)

ptr FFF0
FFF1
float data = 50.8; FFF2
float *ptr;
FFF3
ptr = &data;
data FFF4 50.8
FFF5
FFF6

11
Assignment of Pointer Variables (Cont
..)

ptr FFF0 FFF4


FFF1
float data = 50.8; FFF2
float *ptr;
FFF3
ptr = &data;
data FFF4 50.8
FFF5
FFF6

12
Assignment of Pointer Variables (Cont
..)
• Don’t try to assign a specific integer value to a
pointer variable since it can be disastrous
float *ptr;
ptr = 120; //This is wrong.
h they are both integrals
float data = 50.0;
float *ptr;
ptr = &data; //This is valid
Initializing pointers
• A pointer can be initialized during declaration by
assigning it the address of an existing variable
float data = 50.8;
float ptr = &data;
• If a pointer is not initialized during declaration, it
is wise to give it a NULL (0) value

float *fp = NULL;

14
The NULL pointer
• The NULL pointer is a valid address for
any data type.
– But NULL is not memory address 0.
• It is an error to dereference a pointer
whose value is NULL.
– Such an error may cause your program to
crash, or behave erratically.
– It is the programmer’s job to check for this.
Dereferencing
• Dereferencing – Using a pointer variable
to access the value stored at the location
pointed by the variable
– Provide indirect access to values and also called
indirection
• Done by using the dereferencing operator
* in front of a pointer variable
– Unary operator
– Highest precedence
Dereferencing (Cont ..)
• Example:
float data = 50.8;
float *ptr;
ptr = &data;
cout << *ptr;
• Once the pointer variable ptr has been declared,
*ptr represents the value pointed to by ptr.

OUTPUT:
50.8
Dereferencing (Cont ..)
• The dereferencing operator * can also be used
in assignments.
*ptr = 200;
– Make sure that ptr has been properly initialized
float data;
float *ptr;
ptr = &data;
*ptr = 200;
cout << *ptr;
OUTPUT:
200
Dereferencing Example
#include <iostream.h>
ptr FFF0 FFF4
void main()
{ FFF1
float data = 50.8;
float *ptr; FFF2
ptr = &data; FFF3
cout << ptr << *ptr << endl;
*ptr = 27.4; data FFF4 50.8
cout << *ptr << endl;
FFF5
cout << data << endl;
} FFF6

Output:
#include <iostream.h>

void main()
{
float data = 50.8; ptr FFF0 FFF4
float *ptr;
ptr = &data; FFF1
cout << ptr <<“ ”<< *ptr << endl;
*ptr = 27.4; FFF2
cout << *ptr << endl; FFF3
cout << data << endl;
} data FFF4 50.8
FFF5
OUTPUT: FFF6
FFF4 50.8
Dereferencing Example (Cont ..)
#include <iostream.h>

void main()
{
float data = 50.8; ptr FFF0 FFF4
float *ptr;
ptr = &data; FFF1
cout << ptr <<“ ”<< *ptr << endl;
*ptr = 27.4; FFF2
cout << *ptr << endl; FFF3
cout << data << endl;
} data FFF4 27.4
FFF5
OUTPUT: FFF6
FFF4 50.8
Dereferencing Example (Cont ..)
#include <iostream.h>

void main()
{ ptr FFF0 FFF4
float data = 50.8;
float *ptr; FFF1
ptr = &data;
FFF2
cout << ptr << *ptr << endl;
*ptr = 27.4; FFF3
cout << *ptr << endl;
cout << data << endl; data FFF4 27.4
} FFF5

OUTPUT: FFF6
27.4
Dereferencing Example (Cont ..)
#include <iostream.h>
ptr FFF0 FFF4
void main()
{ FFF1
float data = 50.8;
float *ptr; FFF2
ptr = &data; FFF3
cout << ptr << *ptr << endl;
*ptr = 27.4; data FFF4 27.4
cout << *ptr << endl;
FFF5
cout << data << endl;
} FFF6

OUTPUT
???
// more pointers
#include <iostream>
using namespace std;

int main ()
{
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;

p1 = &firstvalue; // p1 = address of firstvalue


p2 = &secondvalue; // p2 = address of secondvalue
*p1 = 10; // value pointed to by p1 = 10
*p2 = *p1; // value pointed to by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer is copied)
*p1 = 20; // value pointed by p1 = 20

cout << "firstvalue is " << firstvalue << '\n';


cout << "secondvalue is " << secondvalue << '\n'; firstvalue is 10
return 0; secondvalue is 20
}
Why Pointers?

• To modify a variable in a function that is


not a global, or a local to that function
• To save space
• To save time
• To use dynamic memory (Lecture A6)
• Used extensively in linked structures
Passing pointers to a function
#include <iostream>
Solution 1
void fakeSwap(int a, int b)
{
int tmp;

tmp = a;
a = b;
b = tmp;
}

int main()
{
int x = 1, y = 2;

fakeSwap(x, y);
cout << x << " " << y << endl;
}

10.03.2021/Lecture – 1.27 Page : 27 CSC1203/Ridwan


#include <iostream >
Solution 1
void fakeSwap(int a, int b)
{
int tmp;

tmp = a;
a = b;
b = tmp;
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.28 Page : 28 CSC1203/Ridwan


#include < iostream >
Solution 1
void fakeSwap(int a, int b)
{ tmp:
int tmp; 0x2060

a:
tmp = a; 1 0x2038
a = b;
b:
b = tmp; 2 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.29 Page : 29 CSC1203/Ridwan


#include < iostream >
Solution 1
void fakeSwap(int a, int b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = a; 1 0x2038
a = b;
b:
b = tmp; 2 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.30 Page : 30 CSC1203/Ridwan


#include < iostream >
Solution 1
void fakeSwap(int a, int b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = a; 2 0x2038
a = b;
b:
b = tmp; 2 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.31 Page : 31 CSC1203/Ridwan


#include < iostream >
Solution 1
void fakeSwap(int a, int b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = a; 2 0x2038
a = b;
b:
b = tmp; 1 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.32 Page : 32 CSC1203/Ridwan


#include < iostream >
Solution 1
void fakeSwap(int a, int b)
{
int tmp;

tmp = a;
a = b;
b = tmp;
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
fakeSwap(x, y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.33 Page : 33 CSC1203/Ridwan


#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{
int tmp;

tmp = *a;
*a = *b;
*b = tmp;
}

int main()
{
int x = 1, y = 2;

trueSwap(&x, &y);
cout << x << " " << y << endl;
}

10.03.2021/Lecture – 1.34 Page : 34 CSC1203/Ridwan


#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{
int tmp;

tmp = *a;
*a = *b;
*b = tmp;
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << endl; 2 0x2010
}

10.03.2021/Lecture – 1.35 Page : 35 CSC1203/Ridwan


#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{ tmp:
int tmp; 0x2060

a:
tmp = *a; addr of x 0x2038
*a = *b;
b:
*b = tmp; addr of y 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << 2 0x2010
endl;
}
10.03.2021/Lecture – 1.36 Page : 36 CSC1203/Ridwan
#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = *a; addr of x 0x2038
*a = *b;
b:
*b = tmp; addr of y 0x2040
}

int main()
{
int x = 1, y = 2; x:
1 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << 2 0x2010
endl;
}
10.03.2021/Lecture – 1.37 Page : 37 CSC1203/Ridwan
#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = *a; addr of x 0x2038
*a = *b;
b:
*b = tmp; addr of y 0x2040
}

int main()
{
int x = 1, y = 2; x:
2 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << 2 0x2010
endl;
}
10.03.2021/Lecture – 1.38 Page : 38 CSC1203/Ridwan
#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{ tmp:
int tmp; 1 0x2060

a:
tmp = *a; addr of x 0x2038
*a = *b;
b:
*b = tmp; addr of y 0x2040
}

int main()
{
int x = 1, y = 2; x:
2 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << 1 0x2010
endl;
}
10.03.2021/Lecture – 1.39 Page : 39 CSC1203/Ridwan
#include < iostream >
Solution 2
void trueSwap(int* a, int* b)
{
int tmp;

tmp = *a;
*a = *b;
*b = tmp;
}

int main()
{
int x = 1, y = 2; x:
2 0x2000
trueSwap(&x, &y);
y:
cout << x << " " << y << 1 0x2010
endl;
}
10.03.2021/Lecture – 1.40 Page : 40 CSC1203/Ridwan
More example
int MyFunction(int *p, int i)
void main () {
{ *p = 3;
int r, s = 5, t = 6; i = 4;
int *tp = &t; return i;
r = MyFunction(tp,s); }
cout << r <<“ ”<< t<< endl;

r = MyFunction(&t,s);
cout << r <<“ ”<< t<< endl; Out Put:

4 3
r = MyFunction(&s,*tp); 4 3
4 6
cout << r <<“ ”<< t<< endl;

}
 Array names can be used as a pointer constants, and pointer can be used as array
names.

 Array name is really a pointer as it holds the starting address of the array.

What will be the out put of


cout << numbers << endl; ???
Array elements always store together into memory as in figure

Following figure shows the equivalence of subscript notation and


pointer notation of an Array.
Pointers and Arrays
Type array[size];
Type* pPtr = array + i;
Type* qPtr = array + j;

 The name array is equivalent to &array[0]


 pPtr++ increments pPtr to point to the next
element of array.
 pPtr += n increments pPtr to point to n elements
beyond where it currently points.
 pPtr-qPtr equals i-j.

10.03.2021/Lecture – 1.44 Page : 44 CSC1203/Ridwan


Pointers and Arrays (cont)

A normal 1 dimensional array:


Type array[size];

 array[0] is equivalent to *array


 array[n] is equivalent to *(array + n)

10.03.2021/Lecture – 1.45 Page : 45 CSC1203/Ridwan


Basic Pointer Arithmetic
0x2008 0x200C 0x2010 0x2014 0x2018
array:
0x2008

0 1 2 3 4

pPtr: qPtr:
0x2004 0x2008 0x2000 NULL

float array[5];
float* pPtr = array;
float* qPtr = NULL;

10.03.2021/Lecture – 1.46 Page : 46 CSC1203/Ridwan


0x2008 0x200C 0x2010 0x2014 0x2018
array:
0x2008

0 1 2 3 4

pPtr: qPtr:
0x2004 0x200C 0x2000 NULL

float array[5];
float* pPtr = array;
float* qPtr = NULL;

pPtr++; /* pPtr now holds the address: &array[1] */

10.03.2021/Lecture – 1.47 Page : 47 CSC1203/Ridwan


0x2008 0x200C 0x2010 0x2014 0x2018
array:
0x2008

0 1 2 3 4

pPtr: qPtr:
0x2004 0x2018 0x2000 NULL

float array[5];
float* pPtr = array;
float* qPtr = NULL;

pPtr++; /* pPtr = &array[1] */


pPtr += 3; /* pPtr now hold the address: &array[4] */

10.03.2021/Lecture – 1.48 Page : 48 CSC1203/Ridwan


0x2008 0x200C 0x2010 0x2014 0x2018
array:
0x2008

0 1 2 3 4

pPtr: qPtr:
0x2004 0x2018 0x2000 0x2010

float array[5];
float* pPtr = array;
float* qPtr = NULL;

pPtr++; /* pPtr = &array[1] */


pPtr += 3; /* pPtr = &array[4] */
qPtr = array + 2; /*qPtr now holds the address &array[2]*/

10.03.2021/Lecture – 1.49 Page : 49 CSC1203/Ridwan


0x2008 0x200C 0x2010 0x2014 0x2018
array:
0x2008

0 1 2 3 4

pPtr: qPtr:
0x2004 0x2018 0x2000 0x2010

float array[5];
float* pPtr = array;
float* qPtr = NULL;

pPtr++; /* pPtr = &array[1] */


pPtr += 3; /* pPtr = &array[4] */
qPtr = array + 2; /* qPtr = &array[2] */
Cout<< pPtr-qPtr;
10.03.2021/Lecture – 1.50 Page : 50 CSC1203/Ridwan
Pointer to an Array
#include <iostream>
using namespace std;
int main ()
{
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double *p;
p = balance;
cout << "Array values using pointer " << endl;
for ( int i = 0; i < 5; i++
cout << *(p + i) << endl;
}
return 0;
}

Array values using pointer


1000.0
2 .0
3.4
17 .0
50.0
1 void main( void )
2{
3 float r[5] = {22.5,34.8,46.8,59.1,68.3};
1st element: 22.5
4 cout <<"1st element: "<< r[0] <<"\n"; 1st element: 22.5
5 cout <<"1st element: "<< *r <<"\n"; 3rd element: 46.8
6 cout <<"3rd element: "<< r[2] <<"\n"; 3rd element: 46.8
1st element: 22.5
7 cout <<"3rd element: "<< *(r+2)<<"\n"; 1st element: 22.5
8 float *p; 3rd element: 46.8
9 p = r; //&r[0] 3rd element: 46.8
Element 1 is: 22.5
10 cout <<"1st element: "<< p[0] <<"\n";
Element 2 is: 34.8
11 cout <<"1st element: "<< *p <<"\n"; Element 3 is: 46.8
12 cout <<"3rd element: "<< p[2]<<"\n"; Element 4 is: 59.1
13 cout <<"3rd element: "<< *(p+2)<<"\n"; Element 5 is: 68.3

14 for(int i=0; i<5; i++)


15 cout <<"Element "<<(i+1)<<" is: "<<*p+
16 +<<"\n";
}
An array is simply a block of memory. An array can
be accessed with pointers as well as with [] square
brackets. The name of an array variable is a pointer
to the first element in the array. So, any operation
that can be achieved by array subscripting can also
be done with pointers or vice-versa.
1st element: 22.5
1st element: 22.5
3rd element: 46.8
3rd element: 46.8
1st element: 22.5
1st element: 22.5
3rd element: 46.8
3rd element: 46.8
Element 1 is: 22.5
Element 2 is: 34.8
Element 3 is: 46.8
Element 4 is: 59.1
Element 5 is: 68.3

You might also like