100% found this document useful (1 vote)
122 views

Pointers, Dynamic Data, and Reference Types

ptr = new char; *ptr = 'B'; delete ptr; - ptr is declared as a pointer to char and dynamically allocated memory using new - The char at the allocated memory is set to 'B' - The memory pointed to by ptr is deallocated using delete, freeing up the memory

Uploaded by

Abdullah Zafar
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
122 views

Pointers, Dynamic Data, and Reference Types

ptr = new char; *ptr = 'B'; delete ptr; - ptr is declared as a pointer to char and dynamically allocated memory using new - The char at the allocated memory is set to 'B' - The memory pointed to by ptr is deallocated using delete, freeing up the memory

Uploaded by

Abdullah Zafar
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 26

Pointers, Dynamic Data, and

Reference Types
• Review on Pointers
• Reference Variables
• Dynamic Memory Allocation
– The new operator
– The delete operator
– Dynamic Memory Allocation for Arrays

1
C++ Data Types

simple structured

integral enum floating array struct union class

char short int long bool

float double long double address

pointer reference
2
Recall that . . .
char str [ 8 ];

• str is the base address of the array.


• We say str is a pointer because its value is an address.
• It is a pointer constant because the value of str itself
cannot be changed by assignment. It “points” to the
memory location of a char.

6000

‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’


str [0] [1] [2] [3] [4] [5] [6] [7]

3
Addresses in Memory
• When a variable is declared, enough memory to hold a value
of that type is allocated for it at an unused memory location.
This is the address of the variable

int x;
float number;
char ch;

2000 2002 2006

x number ch
4
Obtaining Memory Addresses
• The address of a non-array variable can be obtained by using
the address-of operator &
2000 2002 2006
int x;
float number;
x number ch
char ch;

cout << “Address of x is “ << &x << endl;

cout << “Address of number is “ << &number << endl;

cout << “Address of ch is “ << &ch << endl;

5
What is a pointer variable?

• A pointer variable is a variable whose value is the address of a


location in memory.

• To declare a pointer variable, you must specify the type of


value that the pointer will point to, for example,

int* ptr; // ptr will hold the address of an int

char* q; // q will hold the address of a char

6
Using a Pointer Variable
2000
int x;
12
x = 12;
x

3000
int* ptr;
2000
ptr = &x;
ptr

NOTE: Because ptr holds the address of x,


we say that ptr “points to” x
7
*: dereference operator
2000
int x;
12
x = 12;
x

3000
int* ptr;
2000
ptr = &x;
ptr
cout << *ptr;

NOTE: The value pointed to by ptr is denoted by *ptr


8
Using the Dereference Operator
2000
int x;
12 5
x = 12;
x

3000
int* ptr;
2000
ptr = &x;
ptr

*ptr = 5;
// changes the value at the
address ptr points to 5
9
Self –Test on Pointers
4000
char ch;
A Z
ch = ‘A’;
ch

char* q; 5000 6000

q = &ch; 4000 4000


q p
*q = ‘Z’;
char* p;
p = q; // the rhs has value 4000

// now p and q both point to 10ch


Using a Pointer to Access the
Elements of a String
char msg[ ] =“Hello”;
msg
char* ptr;
3000
ptr = msg;
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
*ptr = ‘M’ ;
‘M’ ‘a’
ptr++;
*ptr = ‘a’;
3000
3001

ptr

11
Reference Variables
Reference variable = alias for another variable
- Contains the address of a variable (like a pointer)
- No need to perform any dereferencing (unlike a pointer)
- Must be initialized when it is declared

int x = 5;
int &z = x; // z is another name for x
int &y ; //Error: reference must be initialized
cout << x << endl; -> prints 5
cout << z << endl; -> prints 5

z = 9; // same as x = 9;

cout << x << endl; -> prints 9


cout << z << endl; -> prints 9
12
Why Reference Variables
• Are primarily used as function parameters

• Advantages of using references:


– you don’t have to pass the address of a variable
– you don’t have to dereference the variable inside the
called function

13
Reference Variables Example
#include <iostream.h>
void p_swap(int *a, int *b)
{
// Function prototypes
(required in C++) int temp;
temp = *a; (2)
void p_swap(int *, int *); *a = *b; (3)
*b = temp;
void r_swap(int&, int&);
}
int main (void){
void r_swap(int &a, int &b)
int v = 5, x = 10;
{
cout << v << x << endl;
int temp;
p_swap(&v,&x);
temp = a; (2)
cout << v << x << endl;
a = b; (3)
r_swap(v,x); b = temp;
cout << v << x << endl; }
return 0;
14
}
Dynamic Memory Allocation
In C and C++, three types of memory are used by programs:

• Static memory - where global


and static variables live

• Heap memory - dynamically


allocated at execution time
- "managed" memory accessed
using pointers

• Stack memory - used by


automatic variables

15
3 Kinds of Program Data
• STATIC DATA: Allocated at compiler time

• DYNAMIC DATA: explicitly allocated and


deallocated during program execution by C++
instructions written by programmer using operators
new and delete
• AUTOMATIC DATA: automatically created at
function entry, resides in activation frame of the
function, and is destroyed when returning from
function
16
Dynamic Memory Allocation Diagram
High-end

Run-time allocated
Stack

memory
Heap

Compile-time
static data

allocated
memory
Program
code

Low-end

17
Dynamic Memory Allocation
• In C, functions such as malloc() are used to
dynamically allocate memory from the Heap.
• In C++, this is accomplished using the new and
delete operators
• new is used to allocate memory during execution time
– returns a pointer to the address where the object is
to be stored
– always returns a pointer to the type that follows the
new
18
Operator new Syntax

new DataType

new DataType [IntExpression]

• If memory is available, in an area called the heap (or free


store) new allocates the requested object or array, and
returns a pointer to (address of ) the memory allocated.
• Otherwise, program terminates with error message.
• The dynamically allocated object exists until the delete
operator destroys it.
19
Operator new
2000
char* ptr; ???
5000

ptr
ptr = new char;
5000
*ptr = ‘B’; ‘B’

cout << *ptr;

NOTE: Dynamic data has no variable name


20
The NULL Pointer
• There is a pointer constant called the “null pointer”
denoted by NULL
• But NULL is not memory address 0.
• NOTE: 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.

while (ptr != NULL) {


. . . // ok to use *ptr here
} 21
Operator delete Syntax

delete Pointer

delete [ ] Pointer

• The object or array currently pointed to by Pointer is


deallocated, and the value of Pointer is undefined. The
memory is returned to the free store.
• Good idea to set the pointer to the released
memory to NULL
• Square brackets are used with delete to deallocate a
dynamically allocated array.
22
Operator delete
2000
char* ptr; 5000
???

ptr
ptr = new char;
5000
*ptr = ‘B’; ‘B’
NOTE:
cout << *ptr; delete deallocates the
memory pointed to by ptr
delete ptr;
23
Example
char *ptr ;
3000
ptr
ptr = new char[ 5 ]; ???
NULL
6000
???

strcpy( ptr, “Bye” );

ptr[ 0 ] = ‘u’; 6000


‘B’ ‘y’ ‘e’ ‘\0’
delete [] ptr; ‘u’
// deallocates the array pointed to by ptr
ptr = NULL; // ptr itself is not deallocated
// the value of ptr becomes undefined

24
Pointers and Constants
char* p;
p = new char[20];

char c[] = “Hello”;


const char* pc = c; //pointer to a constant
pc[2] = ‘a’; // error
pc = p;

char *const cp = c; //constant pointer


cp[2] = ‘a’;
cp = p; // error

const char *const cpc = c; //constant pointer to a const


cpc[2] = ‘a’; //error
cpc = p; //error
25
Take Home Message
• Be aware of where a pointer points to, and
what is the size of that space.

• Have the same information in mind when


you use reference variables.

• Always check if a pointer points to NULL


before accessing it.
26

You might also like