SlideShare a Scribd company logo
1 of 55
Download to read offline
ÔN TẬP VỀ CON TRỎ 
Trần Giang Sơn 
tgson@cse.hcmut.edu.vn 
Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học & Kỹ thuật Máy tính
Nội dung 
•Biến 
•Biến con trỏ 
•Cấp phát bộ nhớ 
•Con trỏ của con trỏ 
•Truyền tham số 
•Ví dụ truyền tham số 
•Mảng cấp phát động 
2
BIẾN 
•Khai báo biến 
short x; 
char c; 
float z = 5; 
x = 1; 
-Tên gọi 
-Địa chỉ 
-Giá trị 
-Kích thước 
3 
Addr 
Value 
Name 
120 
1 
x 
121 
130 
c 
150 
5 
z 
151 
152 
153
BIẾN CON TRỎ 
•Khai báo biến 
short x; 
char c; 
float z = 5; 
x = 1; 
short* px; 
float* pz; 
(int *p, q; //q : int 
int *p, *q) 
4 
Addr 
Value 
Name 
120 
1 
x 
121 
130 
c 
150 
5 
z 
151 
152 
153 
200 
px 
201 
202 
203 
204-207 
pz
BIẾN CON TRỎ 
•Khai báo biến 
short x; 
char c; 
float z = 5; 
x = 1; 
short* px; 
float* pz; 
px = &x; //gán trị 
pz = &z; 
(px = NULL; 
px = 0;) 
Addr 
Value 
Name 
120 
1 
x 
121 
130 
c 
150 
5 
z 
151 
152 
153 
200 
120 
px 
201 
202 
203 
204-207 
150 
pz 
5
BIẾN CON TRỎ 
•Một số tính chất của biến con trỏ: 
–Chứa địa chỉ của một biến khác, chứ không chứa giá trị : 
px = &x;// OK px = 120; // lỗi 
–Kích thước tất cả các biến con trỏ đều bằng nhau. Kiểu con trỏ dùng để xác định kích thước vùng nhớ khi thao tác: 
px = px + 10; // 10 = 10*size(short) 
–Thao tác hạn chế 
•Không thể thực hiện các phép cộng, trừ, nhân, chia … 
•Chỉ thực hiện được phép gán, phép cộng với hằng số 
6
CẤP PHÁT BỘ NHỚ 
•Cấp phát stack: 
–Cấp phát ở stack 
–Muốn cấp phát chỉ cần khai báo 
–Tự động hủy 
•Cấp phát heap 
–Cấp phát ở heap 
–Muốn cấp phát, dùng toán tử new 
–Hủy dùng toán tử delete 
7
CẤP PHÁT BỘ NHỚ 
•int a; 
int* pa; 
pa = &a; 
int* pb; 
8 
Addr 
Value 
100 
a 
150 
100 
pa 
200 
pb 
Addr 
Value
CẤP PHÁT BỘ NHỚ 
•int a; 
int* pa; 
pa = &a; 
int* pb; 
pb = new int; 
9 
Addr 
Value 
100 
a 
150 
100 
pa 
200 
800 
pb 
Addr 
Value 
800
CẤP PHÁT BỘ NHỚ 
•Có 2 cách thao tác vùng nhớ a: 
a = 5; *pa = 5; 
•Chỉ có một cách thao tác vùng nhớ heap: 
đó là thông qua 
con trỏ: 
*pb = 15 
10 
Addr 
Value 
100 
a 
150 
100 
pa 
200 
800 
pb 
Addr 
Value 
800 
15
CẤP PHÁT BỘ NHỚ 
11
CON TRỎ CỦA CON TRỎ 
int** p2; 
int* p1; 
int a = 10; 
printf("%dn", a); 
p1 = &a; 
p2 = &p1; 
*p1 = 15; 
printf("%dn", a); 
**p2 = 20; 
printf("%dn", a); 
12 
Addr 
Value 
100 
p2 
150 
p1 
200 
10 
a
CON TRỎ CỦA CON TRỎ 
int** p2; 
int* p1; 
int a = 10; 
printf("%dn", a); 
p1 = &a; 
p2 = &p1; 
*p1 = 15; 
printf("%dn", a); 
**p2 = 20; 
printf("%dn", a); 
13 
Addr 
Value 
100 
150 
p2 
150 
200 
p1 
200 
10 
a
CON TRỎ CỦA CON TRỎ 
int** p2; 
int* p1; 
int a = 10; 
printf("%dn", a); 
p1 = &a; 
p2 = &p1; 
*p1 = 15; 
printf("%dn", a); 
**p2 = 20; 
printf("%dn", a); 
14 
Addr 
Value 
100 
150 
p2 
150 
200 
p1 
200 
15 
a
CON TRỎ CỦA CON TRỎ 
int** p2; 
int* p1; 
int a = 10; 
printf("%dn", a); 
p1 = &a; 
p2 = &p1; 
*p1 = 15; 
printf("%dn", a); 
**p2 = 20; 
printf("%dn", a); 
15 
Addr 
Value 
100 
150 
p2 
150 
200 
p1 
200 
20 
a
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động 
int** p2; 
int a; 
p2 = new int*; 
*p2 = &a; 
**p2 = 10; 
printf("%dn", a); 
16 
Addr 
Value 
100 
p2 
200 
a 
Addr 
Value
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động 
int** p2; 
int a; 
p2 = new int*; 
*p2 = &a; 
**p2 = 10; 
printf("%dn", a); 
17 
Addr 
Value 
100 
800 
p2 
200 
a 
Addr 
Value 
800
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động 
int** p2; 
int a; 
p2 = new int*; 
*p2 = &a; //p2 = 10 err 
**p2 = 10; 
printf("%dn", a); 
18 
Addr 
Value 
100 
800 
p2 
200 
a 
Addr 
Value 
800 
200
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động 
int** p2; 
int a; 
p2 = new int*; 
*p2 = &a; //p2 = 10 err 
**p2 = 10; 
printf("%dn", a); 
19 
Addr 
Value 
100 
800 
p2 
200 
10 
a 
Addr 
Value 
800 
200
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động: 
int** p2; 
p2 = new int*; 
*p2 = new int; 
**p2 = 10; 
printf("%dn", **p2); 
20 
Addr 
Value 
100 
800 
p2 
Addr 
Value 
800
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động: 
int** p2; 
p2 = new int*; 
*p2 = new int; 
**p2 = 10; 
printf("%dn", **p2); 
21 
Addr 
Value 
100 
800 
p2 
Addr 
Value 
800 
900 
900
CON TRỎ CỦA CON TRỎ 
•Con trỏ cấp phát động: 
int** p2; 
p2 = new int*; 
*p2 = new int; 
**p2 = 10; 
printf("%dn", **p2); 
22 
Addr 
Value 
100 
800 
p2 
Addr 
Value 
800 
900 
900 
10
TRUYỀN THAM SỐ 
•Hàm là khối lệnh có nhận tham số và trả về kết quả 
•<accessType> <returnType> 
FunctionName (<parameters>) 
{ ... } 
•Ba cách truyền tham số: 
–Truyền theo kiểu giá trị 
–Truyền theo kiểu tham khảo 
–Truyền theo kiểu trị-kết quả 
23 
i1 
i2 
o 
……
TRUYỀN THAM SỐ 
•Truyền theo giá trị 
–Giá trị của tham số thực được sao chép vào thông số hình thức 
–Mọi sự thay đổi giá trị tham số hình thức không ảnh hưởng đến tham số thực (giá trị gốc) 
void Increment(int Number) 
{ 
Number += 1; 
} 
int a = 10; 
Increment(a); //a = 10 
24 
a 
Number
TRUYỀN THAM SỐ 
•Truyền theo kiểu tham khảo 
–Giá trị của tham số thực được sao chép vào thông số hình thức 
–Sự thay đổi giá trị tham số hình thức ảnh hưởng đến tham số thực (giá trị gốc) 
void Increment1(int & Number) 
{ 
Number += 1; 
} 
int a = 10; 
Increment1(a); //a = 11 
25 
a 
Number
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
26
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1,*p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
27 
Addr 
Value 
100 
600 
p1 
Addr 
Value 
600
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
28 
Addr 
Value 
100 
600 
p1 
Addr 
Value 
600 
10
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
Addr 
Value 
600 
10 
700 
29
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
Addr 
Value 
600 
10 
700 
20 
30
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
t 
304 
700 
b 
308 
600 
a 
Addr 
Value 
600 
10 
700 
20 
31
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
600 
t 
304 
700 
b 
308 
600 
a 
Addr 
Value 
600 
10 
700 
20 
32
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
600 
t 
304 
700 
b 
308 
700 
a 
Addr 
Value 
600 
10 
700 
20 
33
VÍ DỤ 1 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
600 
t 
304 
600 
b 
308 
700 
a 
Addr 
Value 
600 
10 
700 
20 
34
VÍ DỤ 2 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* &a, int* &b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
t 
304 
b 
308 
a 
Addr 
Value 
600 
10 
700 
20 
35
VÍ DỤ 2 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* &a, int* &b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
600 
t 
304 
b 
308 
a 
Addr 
Value 
600 
10 
700 
20 
36
VÍ DỤ 2 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* &a, int* &b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
700 
p1 
200 
700 
p2 
300 
600 
t 
304 
b 
308 
a 
Addr 
Value 
600 
10 
700 
20 
37
VÍ DỤ 2 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* &a, int* &b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
Addr 
Value 
100 
700 
p1 
200 
600 
p2 
300 
600 
t 
304 
b 
308 
a 
Addr 
Value 
600 
10 
700 
20 
38
VÍ DỤ 3 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(&p1, &p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int **a, int **b){ 
int *t; 
t = *a; 
*a = *b; 
*b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
t 
304 
200 
b 
308 
100 
a 
Addr 
Value 
600 
10 
700 
20 
39
VÍ DỤ 3 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(&p1, &p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int **a, int **b){ 
int *t; 
t = *a; 
*a = *b; 
*b = t; 
} 
Addr 
Value 
100 
600 
p1 
200 
700 
p2 
300 
600 
t 
304 
200 
b 
308 
100 
a 
Addr 
Value 
600 
10 
700 
20 
40
VÍ DỤ 3 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(&p1, &p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int **a, int **b){ 
int *t; 
t = *a; 
*a = *b; 
*b = t; 
} 
Addr 
Value 
100 
700 
p1 
200 
700 
p2 
300 
600 
t 
304 
200 
b 
308 
100 
a 
Addr 
Value 
600 
10 
700 
20 
41
VÍ DỤ 3 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(&p1, &p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int **a, int **b){ 
int *t; 
t = *a; 
*a = *b; 
*b = t; 
} 
Addr 
Value 
100 
700 
p1 
200 
600 
p2 
300 
600 
t 
304 
200 
b 
308 
100 
a 
Addr 
Value 
600 
10 
700 
20 
42
MẢNG CẤP PHÁT ĐỘNG 
int* p; 
p = new int[10]; 
*p = 25; //gán 25 cho phần tử đầu tiên p*0+ 
p++; 
*p = 35;// gán 35 cho phần tử thứ 2, p*1+ 
int list[5] = {5, 10, 15, 20, 25}; 
p = list; 
cout << p[2]; 
p[1] = 7; 
cout << p[1]; 
43
MẢNG CẤP PHÁT ĐỘNG 
int* intList; 
int arraySize; 
cout << “Enter array size: “; 
cin >> arraySize; 
intList = new int[arraySize]; 
44
Shallow, Deep Copy 
int* first; 
int* second; 
first = new int[10]; 
45
Shallow, Deep Copy 
second = first; 
delete[] second; 
46
Shallow, Deep Copy 
second = new int[10]; 
for(int i = 0; i<10; i++) 
second[i] = first[i]; 
47
Con trỏ hàm 
float Square(float x){ 
return(x*x); 
} 
float Cubic(float x){ 
return(x*x*x); 
} 
float Max(float (*f)(float),float (*g)(float),float x){ 
return ((*f)(x)>(*g)(x)?(*f)(x):(*g)(x)); 
} 
48
Con trỏ hàm 
void main(){ 
float x; 
printf("nInput x="); 
scanf("%f",&x); 
printf("nSquare of x=%ftis %f ",x, Square(x)); 
printf("nCubic of x=%ftis %f rn",x, Cubic(x)); 
printf("nMax of {x*x,x*x*x} = %frn", 
Max(Square, Cubic,x )); 
} 
49
Con trỏ hàm 
50
Bài tập 
1)Cho biết kết xuất của chương trình sau 
void main(){ 
float x, y, *p, *q, *r; 
x = 100; 
q = &y; 
p = &x; 
r = q; 
*r = x * 2; 
cout << x << “ “ <<y << “n”; 
cout << p << “ “ <<q << “ “ << r <<“n”; 
} 
51
Bài tập 
2) Giả sử một chương trình bắt đầu với những khai báo sau: 
int i = 10; 
int* pi = &i; 
int** ppi = &pi; 
int*** pppi = &ppi; 
Hãy viết bốn lệnh gán khác nhau để tăng giá trị của i lên 1. 
52
Bài tập 
3) Cho biết kết xuất của chương trình sau 
void main() { 
int *p1 = new int; 
*p1 = 10; 
int *p2 = new int; 
*p2 = 20; 
func(p1, p2); 
printf(“%d %d”, *p1, *p2); 
} 
void func(int* a, int* &b){ 
int *t; 
t = a; 
a = b; 
b = t; 
} 
53
ĐỌC THÊM 
•Essential C++, Stanley B. Lippman 
–Pointers Allow for Flexibility (p23) 
•C++ Primer Plus, Steven Prata 
–Chapter 4. COMPOUND TYPES 
54
CÂU HỎI? 
55

More Related Content

What's hot (18)

Tut5 solution
Tut5 solutionTut5 solution
Tut5 solution
 
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modulesLocal sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
 
Stl string
Stl stringStl string
Stl string
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
C đến C++ phần 1
C đến C++ phần 1C đến C++ phần 1
C đến C++ phần 1
 
Bai tap oop c++
Bai tap oop c++Bai tap oop c++
Bai tap oop c++
 
Nmlt c06 ham_in
Nmlt c06 ham_inNmlt c06 ham_in
Nmlt c06 ham_in
 
Ctdl C04
Ctdl C04Ctdl C04
Ctdl C04
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trình
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen java
 
Cpl test1%20key
Cpl test1%20keyCpl test1%20key
Cpl test1%20key
 
Ctdl C02
Ctdl C02Ctdl C02
Ctdl C02
 
Lab4
Lab4Lab4
Lab4
 
3 Function
3 Function3 Function
3 Function
 
Tut6
Tut6Tut6
Tut6
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1
 
Exercise array
Exercise arrayExercise array
Exercise array
 

Similar to Pointer (14)

Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
 
Lesson08
Lesson08Lesson08
Lesson08
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
4 Pointer String Struct
4 Pointer String  Struct4 Pointer String  Struct
4 Pointer String Struct
 
3 Function
3 Function3 Function
3 Function
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 
Chuyen doi he so
Chuyen doi he soChuyen doi he so
Chuyen doi he so
 
Sfd2012Hanoi - Hà Thụy Long - Odho: Mã nguồn mở và các bài toán vật lý
Sfd2012Hanoi - Hà Thụy Long - Odho: Mã nguồn mở và các bài toán vật lýSfd2012Hanoi - Hà Thụy Long - Odho: Mã nguồn mở và các bài toán vật lý
Sfd2012Hanoi - Hà Thụy Long - Odho: Mã nguồn mở và các bài toán vật lý
 
Bai de quy
Bai de quyBai de quy
Bai de quy
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05
 
Chương Trình Con
Chương Trình Con Chương Trình Con
Chương Trình Con
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
 

More from Trần Văn Nam

Phan 2 chuong 8 (chuoi ky tu)
Phan 2   chuong 8 (chuoi ky tu)Phan 2   chuong 8 (chuoi ky tu)
Phan 2 chuong 8 (chuoi ky tu)
Trần Văn Nam
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
Trần Văn Nam
 
Phan 2 chuong 10 (tap tin)
Phan 2   chuong 10 (tap tin)Phan 2   chuong 10 (tap tin)
Phan 2 chuong 10 (tap tin)
Trần Văn Nam
 
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trìnhGiáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Trần Văn Nam
 
Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3
Trần Văn Nam
 
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Trần Văn Nam
 

More from Trần Văn Nam (19)

Tut4 solution
Tut4 solutionTut4 solution
Tut4 solution
 
Phan 2 chuong 8 (chuoi ky tu)
Phan 2   chuong 8 (chuoi ky tu)Phan 2   chuong 8 (chuoi ky tu)
Phan 2 chuong 8 (chuoi ky tu)
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
 
Phan 2 chuong 10 (tap tin)
Phan 2   chuong 10 (tap tin)Phan 2   chuong 10 (tap tin)
Phan 2 chuong 10 (tap tin)
 
Lect09 string
Lect09 stringLect09 string
Lect09 string
 
Lect05 array
Lect05 arrayLect05 array
Lect05 array
 
Huong dan thao_tac_file
Huong dan thao_tac_fileHuong dan thao_tac_file
Huong dan thao_tac_file
 
Cam bien gia toc
Cam bien gia tocCam bien gia toc
Cam bien gia toc
 
Bai tap c
Bai tap cBai tap c
Bai tap c
 
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trìnhGiáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
 
Ctdlgt
CtdlgtCtdlgt
Ctdlgt
 
Chuong 05
Chuong 05Chuong 05
Chuong 05
 
Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3
 
Chapter07 io
Chapter07 ioChapter07 io
Chapter07 io
 
C++ 2011 april_draft
C++ 2011 april_draftC++ 2011 april_draft
C++ 2011 april_draft
 
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
 
Tailieuvkt hk3
Tailieuvkt hk3Tailieuvkt hk3
Tailieuvkt hk3
 
Lenh tat auto_cad hk3
Lenh tat auto_cad hk3Lenh tat auto_cad hk3
Lenh tat auto_cad hk3
 
Nhung ad
Nhung adNhung ad
Nhung ad
 

Pointer

  • 1. ÔN TẬP VỀ CON TRỎ Trần Giang Sơn tgson@cse.hcmut.edu.vn Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học & Kỹ thuật Máy tính
  • 2. Nội dung •Biến •Biến con trỏ •Cấp phát bộ nhớ •Con trỏ của con trỏ •Truyền tham số •Ví dụ truyền tham số •Mảng cấp phát động 2
  • 3. BIẾN •Khai báo biến short x; char c; float z = 5; x = 1; -Tên gọi -Địa chỉ -Giá trị -Kích thước 3 Addr Value Name 120 1 x 121 130 c 150 5 z 151 152 153
  • 4. BIẾN CON TRỎ •Khai báo biến short x; char c; float z = 5; x = 1; short* px; float* pz; (int *p, q; //q : int int *p, *q) 4 Addr Value Name 120 1 x 121 130 c 150 5 z 151 152 153 200 px 201 202 203 204-207 pz
  • 5. BIẾN CON TRỎ •Khai báo biến short x; char c; float z = 5; x = 1; short* px; float* pz; px = &x; //gán trị pz = &z; (px = NULL; px = 0;) Addr Value Name 120 1 x 121 130 c 150 5 z 151 152 153 200 120 px 201 202 203 204-207 150 pz 5
  • 6. BIẾN CON TRỎ •Một số tính chất của biến con trỏ: –Chứa địa chỉ của một biến khác, chứ không chứa giá trị : px = &x;// OK px = 120; // lỗi –Kích thước tất cả các biến con trỏ đều bằng nhau. Kiểu con trỏ dùng để xác định kích thước vùng nhớ khi thao tác: px = px + 10; // 10 = 10*size(short) –Thao tác hạn chế •Không thể thực hiện các phép cộng, trừ, nhân, chia … •Chỉ thực hiện được phép gán, phép cộng với hằng số 6
  • 7. CẤP PHÁT BỘ NHỚ •Cấp phát stack: –Cấp phát ở stack –Muốn cấp phát chỉ cần khai báo –Tự động hủy •Cấp phát heap –Cấp phát ở heap –Muốn cấp phát, dùng toán tử new –Hủy dùng toán tử delete 7
  • 8. CẤP PHÁT BỘ NHỚ •int a; int* pa; pa = &a; int* pb; 8 Addr Value 100 a 150 100 pa 200 pb Addr Value
  • 9. CẤP PHÁT BỘ NHỚ •int a; int* pa; pa = &a; int* pb; pb = new int; 9 Addr Value 100 a 150 100 pa 200 800 pb Addr Value 800
  • 10. CẤP PHÁT BỘ NHỚ •Có 2 cách thao tác vùng nhớ a: a = 5; *pa = 5; •Chỉ có một cách thao tác vùng nhớ heap: đó là thông qua con trỏ: *pb = 15 10 Addr Value 100 a 150 100 pa 200 800 pb Addr Value 800 15
  • 11. CẤP PHÁT BỘ NHỚ 11
  • 12. CON TRỎ CỦA CON TRỎ int** p2; int* p1; int a = 10; printf("%dn", a); p1 = &a; p2 = &p1; *p1 = 15; printf("%dn", a); **p2 = 20; printf("%dn", a); 12 Addr Value 100 p2 150 p1 200 10 a
  • 13. CON TRỎ CỦA CON TRỎ int** p2; int* p1; int a = 10; printf("%dn", a); p1 = &a; p2 = &p1; *p1 = 15; printf("%dn", a); **p2 = 20; printf("%dn", a); 13 Addr Value 100 150 p2 150 200 p1 200 10 a
  • 14. CON TRỎ CỦA CON TRỎ int** p2; int* p1; int a = 10; printf("%dn", a); p1 = &a; p2 = &p1; *p1 = 15; printf("%dn", a); **p2 = 20; printf("%dn", a); 14 Addr Value 100 150 p2 150 200 p1 200 15 a
  • 15. CON TRỎ CỦA CON TRỎ int** p2; int* p1; int a = 10; printf("%dn", a); p1 = &a; p2 = &p1; *p1 = 15; printf("%dn", a); **p2 = 20; printf("%dn", a); 15 Addr Value 100 150 p2 150 200 p1 200 20 a
  • 16. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động int** p2; int a; p2 = new int*; *p2 = &a; **p2 = 10; printf("%dn", a); 16 Addr Value 100 p2 200 a Addr Value
  • 17. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động int** p2; int a; p2 = new int*; *p2 = &a; **p2 = 10; printf("%dn", a); 17 Addr Value 100 800 p2 200 a Addr Value 800
  • 18. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động int** p2; int a; p2 = new int*; *p2 = &a; //p2 = 10 err **p2 = 10; printf("%dn", a); 18 Addr Value 100 800 p2 200 a Addr Value 800 200
  • 19. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động int** p2; int a; p2 = new int*; *p2 = &a; //p2 = 10 err **p2 = 10; printf("%dn", a); 19 Addr Value 100 800 p2 200 10 a Addr Value 800 200
  • 20. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động: int** p2; p2 = new int*; *p2 = new int; **p2 = 10; printf("%dn", **p2); 20 Addr Value 100 800 p2 Addr Value 800
  • 21. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động: int** p2; p2 = new int*; *p2 = new int; **p2 = 10; printf("%dn", **p2); 21 Addr Value 100 800 p2 Addr Value 800 900 900
  • 22. CON TRỎ CỦA CON TRỎ •Con trỏ cấp phát động: int** p2; p2 = new int*; *p2 = new int; **p2 = 10; printf("%dn", **p2); 22 Addr Value 100 800 p2 Addr Value 800 900 900 10
  • 23. TRUYỀN THAM SỐ •Hàm là khối lệnh có nhận tham số và trả về kết quả •<accessType> <returnType> FunctionName (<parameters>) { ... } •Ba cách truyền tham số: –Truyền theo kiểu giá trị –Truyền theo kiểu tham khảo –Truyền theo kiểu trị-kết quả 23 i1 i2 o ……
  • 24. TRUYỀN THAM SỐ •Truyền theo giá trị –Giá trị của tham số thực được sao chép vào thông số hình thức –Mọi sự thay đổi giá trị tham số hình thức không ảnh hưởng đến tham số thực (giá trị gốc) void Increment(int Number) { Number += 1; } int a = 10; Increment(a); //a = 10 24 a Number
  • 25. TRUYỀN THAM SỐ •Truyền theo kiểu tham khảo –Giá trị của tham số thực được sao chép vào thông số hình thức –Sự thay đổi giá trị tham số hình thức ảnh hưởng đến tham số thực (giá trị gốc) void Increment1(int & Number) { Number += 1; } int a = 10; Increment1(a); //a = 11 25 a Number
  • 26. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } 26
  • 27. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1,*p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } 27 Addr Value 100 600 p1 Addr Value 600
  • 28. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } 28 Addr Value 100 600 p1 Addr Value 600 10
  • 29. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 Addr Value 600 10 700 29
  • 30. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 Addr Value 600 10 700 20 30
  • 31. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 t 304 700 b 308 600 a Addr Value 600 10 700 20 31
  • 32. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 600 t 304 700 b 308 600 a Addr Value 600 10 700 20 32
  • 33. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 600 t 304 700 b 308 700 a Addr Value 600 10 700 20 33
  • 34. VÍ DỤ 1 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 600 t 304 600 b 308 700 a Addr Value 600 10 700 20 34
  • 35. VÍ DỤ 2 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* &a, int* &b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 t 304 b 308 a Addr Value 600 10 700 20 35
  • 36. VÍ DỤ 2 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* &a, int* &b){ int *t; t = a; a = b; b = t; } Addr Value 100 600 p1 200 700 p2 300 600 t 304 b 308 a Addr Value 600 10 700 20 36
  • 37. VÍ DỤ 2 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* &a, int* &b){ int *t; t = a; a = b; b = t; } Addr Value 100 700 p1 200 700 p2 300 600 t 304 b 308 a Addr Value 600 10 700 20 37
  • 38. VÍ DỤ 2 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* &a, int* &b){ int *t; t = a; a = b; b = t; } Addr Value 100 700 p1 200 600 p2 300 600 t 304 b 308 a Addr Value 600 10 700 20 38
  • 39. VÍ DỤ 3 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(&p1, &p2); printf(“%d %d”, *p1, *p2); } void func(int **a, int **b){ int *t; t = *a; *a = *b; *b = t; } Addr Value 100 600 p1 200 700 p2 300 t 304 200 b 308 100 a Addr Value 600 10 700 20 39
  • 40. VÍ DỤ 3 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(&p1, &p2); printf(“%d %d”, *p1, *p2); } void func(int **a, int **b){ int *t; t = *a; *a = *b; *b = t; } Addr Value 100 600 p1 200 700 p2 300 600 t 304 200 b 308 100 a Addr Value 600 10 700 20 40
  • 41. VÍ DỤ 3 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(&p1, &p2); printf(“%d %d”, *p1, *p2); } void func(int **a, int **b){ int *t; t = *a; *a = *b; *b = t; } Addr Value 100 700 p1 200 700 p2 300 600 t 304 200 b 308 100 a Addr Value 600 10 700 20 41
  • 42. VÍ DỤ 3 void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(&p1, &p2); printf(“%d %d”, *p1, *p2); } void func(int **a, int **b){ int *t; t = *a; *a = *b; *b = t; } Addr Value 100 700 p1 200 600 p2 300 600 t 304 200 b 308 100 a Addr Value 600 10 700 20 42
  • 43. MẢNG CẤP PHÁT ĐỘNG int* p; p = new int[10]; *p = 25; //gán 25 cho phần tử đầu tiên p*0+ p++; *p = 35;// gán 35 cho phần tử thứ 2, p*1+ int list[5] = {5, 10, 15, 20, 25}; p = list; cout << p[2]; p[1] = 7; cout << p[1]; 43
  • 44. MẢNG CẤP PHÁT ĐỘNG int* intList; int arraySize; cout << “Enter array size: “; cin >> arraySize; intList = new int[arraySize]; 44
  • 45. Shallow, Deep Copy int* first; int* second; first = new int[10]; 45
  • 46. Shallow, Deep Copy second = first; delete[] second; 46
  • 47. Shallow, Deep Copy second = new int[10]; for(int i = 0; i<10; i++) second[i] = first[i]; 47
  • 48. Con trỏ hàm float Square(float x){ return(x*x); } float Cubic(float x){ return(x*x*x); } float Max(float (*f)(float),float (*g)(float),float x){ return ((*f)(x)>(*g)(x)?(*f)(x):(*g)(x)); } 48
  • 49. Con trỏ hàm void main(){ float x; printf("nInput x="); scanf("%f",&x); printf("nSquare of x=%ftis %f ",x, Square(x)); printf("nCubic of x=%ftis %f rn",x, Cubic(x)); printf("nMax of {x*x,x*x*x} = %frn", Max(Square, Cubic,x )); } 49
  • 51. Bài tập 1)Cho biết kết xuất của chương trình sau void main(){ float x, y, *p, *q, *r; x = 100; q = &y; p = &x; r = q; *r = x * 2; cout << x << “ “ <<y << “n”; cout << p << “ “ <<q << “ “ << r <<“n”; } 51
  • 52. Bài tập 2) Giả sử một chương trình bắt đầu với những khai báo sau: int i = 10; int* pi = &i; int** ppi = &pi; int*** pppi = &ppi; Hãy viết bốn lệnh gán khác nhau để tăng giá trị của i lên 1. 52
  • 53. Bài tập 3) Cho biết kết xuất của chương trình sau void main() { int *p1 = new int; *p1 = 10; int *p2 = new int; *p2 = 20; func(p1, p2); printf(“%d %d”, *p1, *p2); } void func(int* a, int* &b){ int *t; t = a; a = b; b = t; } 53
  • 54. ĐỌC THÊM •Essential C++, Stanley B. Lippman –Pointers Allow for Flexibility (p23) •C++ Primer Plus, Steven Prata –Chapter 4. COMPOUND TYPES 54