Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers.
Chapter 5: Pointers and Strings
description
Transcript of Chapter 5: Pointers and Strings
![Page 1: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/1.jpg)
2003 Prentice Hall, Inc. All rights reserved.
1
Chapter 5: Pointers and Strings
OutlineIntroduction
Pointer Variable Declarations and Initialization Pointer Operators
Pointer of Complex StructureOther Pointer OperationsCalling Functions by ReferenceRelationship between pointer and arrayDynamic Data Storage
![Page 2: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/2.jpg)
2003 Prentice Hall, Inc. All rights reserved.
2
Introduction
• Pointers – Powerful, but difficult to master– Simulate pass-by-reference – Close relationship with arrays and strings
![Page 3: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/3.jpg)
2003 Prentice Hall, Inc. All rights reserved.
3
Pointer Variable Declarations and Initialization
• Pointer variables– Contain memory addresses as values – Normally, variable contains specific value (direct reference)– Pointers contain address of variable that has specific value
(indirect reference)• Indirection
– Referencing value through pointer• Pointer declarations
– * indicates variable is pointerint *countPtr;
declares pointer to int, pointer of type int *– Multiple pointers require multiple asterisks
int *myPtr1, *myPtr2;
count
7
countPtr
count
7
![Page 4: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/4.jpg)
2003 Prentice Hall, Inc. All rights reserved.
4
Pointer Variable Declarations and Initialization
• Can declare pointers to any data type• Pointer initialization
– Initialized to 0, NULL, or address• 0 or NULL points to nothing
![Page 5: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/5.jpg)
2003 Prentice Hall, Inc. All rights reserved.
5
Pointer Operators
• & (address operator)– Returns memory address of its operand– Example
int y = 5;int *yPtr;yPtr = &y; // yPtr gets address of y
– yPtr “points to” y
yPtr
y5
yptr
600004 600000
y
600000 5
address of y is value of yptr
![Page 6: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/6.jpg)
2003 Prentice Hall, Inc. All rights reserved.
6
Pointer Operators
• * (indirection/dereferencing operator)– Returns synonym for object its pointer operand points to– *yPtr returns y (because yPtr points to y).– dereferenced pointer is lvalue
*yptr = 9; // assigns 9 to y• * and & are inverses of each other• Example 1 #include <iostream>
int main()
{ int *p;
int q=3, k=5;
p=&q;
cout << "p is " <<p<<" *p is " <<*p<<" q is "<<q<<endl;
*p=4;
cout << "p is " <<p<<" *p is " <<*p<<" q is "<<q<<endl;
*p=k;
cout << "p is " <<p<<" *p is " <<*p<<" q is "<<q<<endl;
return 0;
}
![Page 7: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/7.jpg)
2003 Prentice Hall, Inc. All rights reserved.
7
Pointer Operators
![Page 8: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/8.jpg)
2003 Prentice Hall, Inc. All rights reserved.
8
Pointer of complex structure
• Example 2#include <iostream>
struct Student{
int grade;
char name[20];
};
int main()
{
struct Student *p, q;
q.grade = 90;
strcpy(q.name,"Smith");
cout << "Grade " <<q.grade<< " Name " <<q.name<<endl;
p=&q;
cout << "Grade " << p->grade <<" Name "<<p->name<<endl;
return 0;
}
![Page 9: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/9.jpg)
2003 Prentice Hall, Inc. All rights reserved.
9
Pointer of complex structure
![Page 10: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/10.jpg)
2003 Prentice Hall, Inc. All rights reserved.
10
Other Pointer Operations
• Example 3
#include <iostream>
int main()
{
int i=3, j=3, *p1, *p2;
p1=&i, p2=&j;
if(*p1==*p2) //used to check if the content is the same.
cout <<"*p1 Equal to *p2"<<endl;
else cout<<"*p1 not Equal to *p2"<<endl;
if(p1==p2) //used to check if they are pointing to the same unit.
cout <<"p1 Equal to p2"<<endl;
else cout <<"p1 not Equal to p2"<<endl;
if(p1<=p2) //it has side-effect, do not use it.
cout <<"p1 no more than p2"<<endl;
else cout <<"p1 less than p2"<<endl;
return 0;
}
![Page 11: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/11.jpg)
2003 Prentice Hall, Inc. All rights reserved.
11
Other Pointer Operations
![Page 12: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/12.jpg)
2003 Prentice Hall, Inc. All rights reserved.
12
Calling Functions by Reference
• 3 ways to pass arguments to function– Pass-by-value arguments– Pass-by-reference with reference arguments– Pass-by-pointer arguments
• return can return one value from function• Example 4
![Page 13: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/13.jpg)
2003 Prentice Hall, Inc. All rights reserved.
13
Calling Functions by Reference#include <iostream>
void f_point( int *i, int *j)
{
*i=3;
*j=4;
}
void f_reference( int &i, int &j)
{
i=3;
j=4;
}
void f_value (int i, int j)
{
i=3;
j=4;
}
int main()
{
int p=1, q=2;
f_point(&p,&q);
cout << "p is "<< p << " q is " <<q <<endl;
p=1;
q=2;
f_reference(p,q);
cout << "p is "<< p << " q is " <<q <<endl;
p=1;
q=2;
f_value(p,q);
cout << "p is "<< p << " q is " <<q <<endl;
return 0;
}
![Page 14: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/14.jpg)
2003 Prentice Hall, Inc. All rights reserved.
14
Calling Functions by Reference
![Page 15: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/15.jpg)
2003 Prentice Hall, Inc. All rights reserved.
15
Relationship Between Pointers and Arrays
• Arrays and pointers closely related– Array name like constant pointer– Pointers can do array subscripting operations
![Page 16: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/16.jpg)
2003 Prentice Hall, Inc. All rights reserved.
16
• Pointer variable and name of array
c[6]
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
Name of array (Note that all elements of this array starts from here, c)
c[0]
c[1]
c[2]
c[3]
c[11]
c[10]
c[9]
c[8]
c[7]
c[5]
c[4]
Position number of the element within array c
Pointer pointing to the address of c[0]
Relationship Between Pointers and Arrays
![Page 17: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/17.jpg)
2003 Prentice Hall, Inc. All rights reserved.
17
c[6]
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
Name of array (Note that all elements of this array starts from here, c)
c[0]
c[1]
c[2]
c[3]
c[11]
c[10]
c[9]
c[8]
c[7]
c[5]
c[4]
Last element
*(pointer+0), or *p
*(pointer+7)
Relationship Between Pointers and Arrays
![Page 18: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/18.jpg)
2003 Prentice Hall, Inc. All rights reserved.
18
Relationship Between Pointers and Arrays
• Accessing array elements with pointers– Element b[ n ] can be accessed by *( bPtr + n )
• Called pointer/offset notation– Addresses
• &b[ 3 ] same as bPtr + 3– Array name can be treated as pointer
• b[ 3 ] same as *( b + 3 )– Pointers can be subscripted (pointer/subscript notation)
• bPtr[ 3 ] same as b[ 3 ]
![Page 19: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/19.jpg)
2003 Prentice Hall, Inc. All rights reserved.
19
#include <iostream>
void f_point( char * i, char * j)
{
*(i+2)='E';
*(j+3)='E';
}
void f_array( char i[], char j[])
{
i[2]='E';
j[3]='E';
}
int main()
{
char p[6]="hello", q[10]="howareyou";
f_point(p,q);
cout << "p is "<< p << " q is " <<q <<endl;
strcpy(p,"hello");
strcpy(q,"howareyou");
f_array(p,q);
cout << "p is "<< p << " q is " <<q <<endl;
return 0;
}
Relationship Between Pointers and Arrays
•Example 5
![Page 20: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/20.jpg)
2003 Prentice Hall, Inc. All rights reserved.
20
Dynamic Data Storage
• Dynamic memory management– Control allocation and deallocation of memory– Operators new and delete
• new operator– Create memory for object– Calls default constructor for object– Returns pointer of specified type– Format
• Providing initializersdouble *ptr = new double( 3.14159 );Time *timePtr = new time( 12, 0, 0 );• Allocating arraysint *gradesArray = new int[ 10 ];
• Example 6
![Page 21: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/21.jpg)
2003 Prentice Hall, Inc. All rights reserved.
21
Dynamic Data Storage
• delete– Destroy dynamically allocated object and free space– Operator delete
• Calls destructor for object• Deallocates memory associated with object
– Memory can be reused to allocate other objects– Deallocating arrays
• delete [] gradesArray;– First calls destructor for each object in array– Then deallocates memory
• delete time;
![Page 22: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/22.jpg)
2003 Prentice Hall, Inc. All rights reserved.
22
Dynamic Data Storage
• Example 6 #include <iostream>
#include <string>
int main()
{
char * p;
int index;
cout << "Input how many characters:" ;
cin >>index;
p = new char [index+1];
cin >> p;
cout <<"p is: " <<p;
delete [] p;
p=NULL;
return 0;
}
![Page 23: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/23.jpg)
2003 Prentice Hall, Inc. All rights reserved.
23
Dynamic Data Storage
![Page 24: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/24.jpg)
2003 Prentice Hall, Inc. All rights reserved.
24
Dynamic Data Storage
• Example 7: Multiple-phase development– Step 1: 7_1.cc– Step 2: 7_2.cc– Step 3: 7_3.cc
![Page 25: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/25.jpg)
2003 Prentice Hall, Inc. All rights reserved.
25
Dynamic Data Storage
• 7_3.cc#include <iostream>
class MyArray{
public:
MyArray();
MyArray(int);
~MyArray();
void printall();
void array_copy(MyArray&);
private:
int size;
int *ptr;
};
MyArray::MyArray()
{
size=0;
ptr=NULL;
}
MyArray::MyArray(int t_size)
{
if(t_size>0){
size=t_size;
ptr=new int[t_size+1];
cout << "Please input "<<t_size<< " intergers:";
for(int i=0;i<t_size;i++)
cin >> ptr[i];
}
else{
size=0;
ptr=NULL;
}
}
MyArray::~MyArray()
{
size=0;
delete [] ptr;
}
![Page 26: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/26.jpg)
2003 Prentice Hall, Inc. All rights reserved.
26
Dynamic Data Storage• 7_3.cc (continue)void MyArray::printall()
{
if(size==0) {
cout <<"NULL"<<endl;
return;
}
for(int i=0;i<size;i++)
cout<<ptr[i]<<" ";
cout <<endl;
}
void MyArray::array_copy(MyArray & b)
{
size=b.size;
delete [] ptr;
ptr=new int [size+1];
for(int i=0; i<size;i++)
ptr[i]=b.ptr[i];
ptr[size]=0;
}
int main()
{
MyArray a, b(4);
cout << "Before copying"<<endl;
a.printall();
b.printall();
a.array_copy(b);
cout << "After copying"<<endl;
a.printall();
b.printall();
return 0;
}
![Page 27: Chapter 5: Pointers and Strings](https://reader036.fdocuments.us/reader036/viewer/2022081505/56815bde550346895dc9cd4e/html5/thumbnails/27.jpg)
2003 Prentice Hall, Inc. All rights reserved.
27
Dynamic Data Storage