Pointers
Contents
Basics of PointerArray and pointer
using array and pointer interchangeably Passing array(pointer) to functions
Dynamic memory allocationString and pointerReference vs. pointer
Pointer
- variables storing memory address
Intimately tied to array and stringOperators
*: deference or indirection operator, e.g. *p &: address operator, e.g. &x
Pointer: Declaration and Usage
void main() {
int i = 5;
// Q: 想儲存 i的位址 ? How?
// A: 宣告一個指標 pint *p = &i ;
// Q: 如何利用 p取出 i的值 ?
// A: 使用 * operatorcout << *p ;
// Q: 我可以印出 i的位址 (p的值 )?
// A: it’s OK!, 如下 :
cout << p;
}
Pointer: Declaration and Usage
void main() {
int i=5, j=6;
int *p = &i ;
// Q: 可以利用 p 來改變 i 的值 ?
// A: yes
*p = *p + 12;
// A: 此外, p 也可以改存其它變數的位址p = &j ;
j = *p + 2; cout << j;
}
Pointer vs. Array
在 C/C++ 程式寫作上, Array和 Pointer 好像雙 生兄弟,經常交換使用。
Array Name Pointer to First Element
main() {
int a[5] = {1,2,3,4,5};
cout << &a[0];
cout << a ;
// 既然 a 記錄 a[0] 的位址,我就可以 ...
cout << *a; // 印出 a[0]
cout << *(a+1) ; // 印出 a[1]
*(a+2) = 0;
}
Array Name Constant Pointer
main() {
int a[5] = {1,2,3,4,5};
int *p;
p = a ; // p = &a[0]
// 利用 p 印出 a[] 的內容for (int i=0;i<=4; i++)
{ cout << *p; p++;}
for (int i=0;i<=4; i++)
{ cout << *a; a++;}
}
Insight Pointer Arithmetic
1
600
a[0] a[1] a[2] a[3] a[4]
Addr
2 3 4 5
604 608 612 616
int a[5] = {1,2,3,4,5};p = a ;p++ ; p+= 2;
p
char a[5] = {‘a’,’b’,’c’,’d’};p = a ; p+= 3;cout << *p;
a
600
a[0] a[1] a[2] a[3] a[4]
Addr
b c d
601 602 603 604
p
p p
Using Array and Pointer Interchangeably
main() {
int a[size] = {1,2,3,4,5};
int *p, i ;
for (p=a, i=0 ;i<size; i++)
cout << *p++;
for (p=a, i=0 ; i<size; i++)
cout << p[i];
}
Passing Array to Function
const int size = 5 ;
main() {
int a[size] = {1,2,3,4,5};
arr_mul2(a, size); // a &a[0]}
void arr_mul2(int* p, int n) {
for(int i = 0; i<n; i++)
p[i] *= 2;
}
Passing Array to Function
EX:what’s the result?
const int size = 5 ;
void arr_mul2(int *, int);
main() {
int a[size] = {1,2,3,4,5};
arr_mul2(&a[1], size-1);
arr_mul2(a+2, size-1);
}
void arr_mul2(int* p, int n) { …… }
Passing Arrays to Functions: Parameter-list Declaration
float arr_mul2(int* , int n) ;// prototypefloat arr_mul2(int *p, int n){ …… } //define
float arr_mul2(int[] , int n) ;// prototypefloat arr_mul2(int p[], int n){ …… } //define
float arr_mul2(int* , int n) ;// prototypefloat arr_mul2(int p[], int n){ …… } //define
float arr_mul2(int[] , int n) ;// prototypefloat arr_mul2(int *p, int n){ …… } //define
Dynamic Memory Allocation
#include <iostream.h>#include <stdlib.h>void main() {
int *p;p = (int *)calloc(10,sizeof(int));for (int i = 0; i<=9; i++)
p[i] = i ;}
Why dynamic memory allocation?
Dynamic Memory Allocation
Allocation:C: calloc(), malloc() C++: new
De-allocation:C: free
free(p);C++: delete
New
void main() { // C version int *p, *q, *r ; p = (int *)malloc(sizeof(int)); q = (int *)calloc(10,sizeof(int)); r = (int *)malloc(sizeof(int)); *r=10; }
void main() { // C++ version int *p, *q, *r ; p = new int ; //allocate one q = new int[10] ; //allocate array r = new int(10) ; //allocate&initialize}
Delete
void main() { int *p, *q, *r ;p = new int ;q = new int[10] ;r = new int(10) ;
…… delete p; // free one elementdelete []q; // free an arraydelete r;
}
Dynamic Memory Allocation
why? Advantages are …..
// int a[10] ;int *p ;int size ;cin >> size;p = new int[size];…….
Array of Pointers
char *sname[50]; // how about char sname[50][20];
s[0]
s[49]
char *sname[50], s[100] ;for (int i = 0 ; i<50; i++) {
cin >> s ;sname[i] = new char[strlen(s)+1];strcpy(sname,s);
}
Array of Pointer
char **sname ; // pointer to pointerint sno; char s[100];
cin >> sno;sname = new char*[sno];
for (int i = 0 ; i<sno; i++) {cin >> s ;sname[i] = new char[strlen(s)+1];strcpy(sname,s);
}
String(char *): pointer to char
void main() {char s1[10] = “hello” ;char s2[] = “hello” ;char *s3 = “hello”;char s4[] = {‘h’,’e’,’l’,’l’,’o’} ;// difference among s1,s2, s3 and s4
}
Utility Functions of String
strcmp: 比較 if (s1 == s2) {….} // ???
strcpy: 複製 s1 = s2 ; // ???
strcat: 連結 s1 = s1+s2; // ???
strlen: strlen(s1); // not including ‘\0’
[NOTE]: must include <string.h>
String
#include <string.h>
void main() {
char s1[] = "Hello";
char s2[] = "C++" ;
char s3[20];
if (strcmp(s1,s2) != 0) {
strcpy(s3,s1) ;
strcat(s3,s2);
}
cout << s3;
}
Self Test
int fun(const char* s1, const char* s2) {
int i ;for (i = 0 ; s1[i] && s2[i] && (s1[i]==s2[i]); ++i) ; // when to exit?return (s1[i]-s2[i]) ;
}
ANSI C++: string type
#include <iostream>#include <string>using namespace std;void main() {
string s1 = "Hello”, s2 = “World” ;string s3 ;s3 = s1 + " " + s2 ;cout << s3 << endl; cout << s3.length() << endl;if (s1 > s2) cout << s1 ;else cout << s2 ;
}
Reference Declaration- pointer free
void main() {int x=5 ;int *p = x ;int& xx = x ; // alias of x
xx = *p + 2; cout << x ;xx++ ;*p++ ;cout << x ;
}
(*p)++;
Reference to Array Elements
void main() {int x[5]= {1,2,3,4,5} ;int& first = x[0] ;int& last = x[4] ;
first *= 2 ;cout << x[0] << endl ;last = first + 2;cout << x[4] << endl;
}
Call by Reference
void change(int *, int&, int ) ;void main() {
int i=5, j=6, k = 7 ;cout << i << j << k << endl;change(&i, j, k);cout << i << j << k << endl;
}void change(int* p,int& q, int r) {
q = *p + r;*p = q + r;r = *p + q;
}
Reference to pointer
int x = 1, y = 2;
int *p = &x;
int*& pp = p ; // alias of p
(*p)++; cout << x << y << endl;
pp = &y ;
(*p)++ ; cout << x << y << endl;
Chapter 4 Implementing ADTs Using Base Language
- final review for C-base features- prepare marching to Class
Built-in Aggregate Data Type
Array
Enumeration
Structure
Union: self-reading
Array
Array of build-in data type int a[10], double x[100]; int n=10; char a[n]; // not ok! const int n =10; char a[n] ; // ok
Array of composite date type struct complex { int x, y; }; complex x[100] ;
Enumeration
(1) Declare a type of a subset of integer(2) Each element with a name
// type name: test// range: 0-3// name of each element: // Spring(0), Summer(1), Fall(2), Winter(3)enum test {Spring, Summer, Fall, Winter} ;main() {
test x ;if (input == ‘s’) x = Spring ; // x = 0x = 0 ; x = 50; // illegal
}
Enumeration
enum season {Spring=1, Summer, Fall, Winter};enum tbound {lb = 18, avg=25, ub=38} ; main() {
season w_type ;tbound b ;….if (b >=lb && b <=avg)
w_type = Spring ;….
}
Structure
nested structure
pointer to structure dynamic memory allocation
passing structure to function by value by reference & pointer