Bài giảng Kỹ thuật lập trình nâng cao - Chương 2: Lập trình con trỏ cung cấp cho người học các kiến thức: Đại chỉ của biến, con trỏ, cấp phát và giải phóng vùng nhớ, con trỏ và mảng một chiều,... Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1CHƯƠNG 2
LẬP TRÌNH CON TRỎ
1
TRẦN MINH THÁI
[e] minhthai@itc.edu.vn
[w] www.minhthai.edu.vn
Trang 2ĐỊA CHỈ CỦA BIẾN
Thông tin của một biến bao gồm:
• Tên biến
• Kiểu dữ liệu của biến
• Giá trị của biến
Mỗi biến sẽ được lưu trữ tại một vị trí xác định trong ô nhớ, nếu kích thước của biến có nhiều byte thì máy tính sẽ cấp phát một dãy các byte liên tiếp nhau, địa chỉ của biến sẽ lưu byte đầu tiên trong dãy các byte này
Trang 3ĐỊA CHỈ CỦA BIẾN (TT)
Ví dụ khai báo:
float x;
int a;
Byte 1 Byte 2 Byte 3 Byte 4
Địa chỉ biến x
Các ô
nhớ của
biến x
Byte 100 Byte 101 Byte 102 Byte 103
Địa chỉ biến a
Các ô nhớ của biến a
Trang 4ĐỊA CHỈ CỦA BIẾN (TT)
• Địa chỉ của biến luôn luôn là một số nguyên (hệ hexa)
dù biến đó chứa giá trị là số nguyên, số thực hay ký
tự, …
• Cách lấy địa chỉ của biến: & tênbiến
• Ví dụ:
void main()
{
int x=7;
float y=10.5;
cout<<"Dia chi cua bien x = "<<&x<<endl;
cout<<"Dia chi cua bien y = "<<&y;
Kết quả
Dia chi cua bien x = 0014FC00 Dia chi cua bien y = 0014FBF4
Trang 5CON TRỎ
• Con trỏ là một biến để chứa địa chỉ, có nhiều loại con trỏ tùy thuộc vào địa chỉ của mỗi loại kiểu biến
• Cách khai báo con trỏ
• Ví dụ:
int *px, y;
float *pm, n;
• Cách lấy giá trị của con trỏ
Kiểu dữ liệu * TênConTrỏ
* TênConTrỏ
Trang 6VÍ DỤ
void main()
{
int *px, y;
float *pa, b;
y=10;
b=14.5;
px= & y;
pa= & b;
cout<<"Gia tri cua px = "<< *px <<endl;
cout<<"Gia tri cua pa = "<< *pa ;
}
Kết quả
Gia tri cua px = 10
Gia tri cua pa = 14.5
Lấy địa chỉ của biến
y gán vào px
Lấy giá trị của con
trỏ px
Trang 7CẤP PHÁT VÀ GIẢI PHÓNG VÙNG NHỚ
• Biến con trỏ phải được cấp phát vùng nhớ trước khi sử dụng
Cú pháp: biến con trỏ = new <kdl>;
• Giải phóng vùng nhớ
Cú pháp: delete biến con trỏ;
VD:
int *a;
a = new int; //Cấp phát vùng nhớ cho a
……
delete a;
Trang 8CON TRỎ VÀ MẢNG MỘT CHIỀU
• Khai báo
<kdl> * tên mảng;
• Cấp phát vùng nhớ
tên mảng = new <kdl>[kích thước];
VD:
int *pa;
pa = new int[50];
…
pa
Trang 9CON TRỎ VÀ MẢNG MỘT CHIỀU
void NhapMang(int *a, int n)
{
for (int i = 0; i < n; i++) {
cout << "Nhap gia tri o vi tri " << i << ": ";
cin >> *(a + i);
} }
void NhapMang(int a [], int n)
{
for (int i = 0; i < n; i++) {
cout << "Nhap gia tri o vi tri " << i << ": ";
cin >> a[i];
} }
Trang 10CON TRỎ HÀM
• Khai báo:
<kdl>(*Tên hàm)(tham số);
VD:
int *Tong(int a, int b);
Thích hợp cho việc tùy chọn (switch) gọi thực hiện trong danh sách các hàm
Trang 11CON TRỎ HÀM
int ChuVi(int a, int b)
{
return (a + b) * 2;
}
int DienTich(int a, int b)
{
return a*b;
}
int Tinh(int a, int b, int (*Ham)(int, int))
{
int kq = (*Ham)(a, b);
return kq;
}
Trang 12CON TRỎ HÀM
void main()
{
int a = 10, b = 6;
int (*Ham)(int, int) = ChuVi;
int p = Tinh(a, b, ChuVi);
cout << "Chu vi cua hcn = " << p;
}
Trang 13BÀI TẬP
Dùng kỹ thuật con trỏ hàm, viết chương trình tính tổng, hiệu, tích và thương của hai phân số phụ thuộc vào người dùng chọn chức năng nào