pointers. contents zbasics of pointer zarray and pointer yusing array and pointer interchangeably...
TRANSCRIPT
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