Khái niệm Con trỏ Pointer: Là biến lưu trữ địa chỉ vùng nhớ của một đối tượng biến, hàm.. Biến con trỏ Pointer variable Chứa địa chỉ vùng nhớ thay vì chứa giá trị.. • Biến x có mộ
Trang 1CƠ SỞ LẬP TRÌNH
CON TRỎ
Trang 2Nội dung
1 Khái niệm
2 Khai báo
3 Thao tác với con trỏ
4 Các phép toán với con trỏ
5 Con trỏ và mảng
6 Mảng con trỏ
7 Con trỏ hàm
Trang 3Khái niệm
Con trỏ (Pointer):
Là biến lưu trữ địa chỉ vùng nhớ của một đối tượng (biến, hàm).
Có tác dụng như truyền tham chiếu.
Có liên quan chặt chẽ đến mảng và chuỗi.
Biến con trỏ (Pointer variable)
Chứa địa chỉ vùng nhớ thay vì chứa giá trị.
Thông thường, biến chứa giá trị (tham chiếu trực tiếp).
Con trỏ chứa địa chỉ của biến mang giá trị cụ thể (tham
Trang 4Khai báo
<type> * <tên biến trỏ>;
Trong đó, <type> là kiểu dữ liệu của biến mà contrỏ đang trỏ đến
Trang 5Thao tác với con trỏ
Toán tử lấy địa chỉ & : Trả về địa chỉ vùng nhớ của biến.
& x địa chỉ của biến x
Ví dụ: int x = 10;
• Sử dụng con trỏ để truy xuất địa chỉ của biến x.
• Biến x có một địa chỉ cụ thể trong vùng nhớ.
• Để lấy địa chỉ biến x: sử dụng toán tử & trước x ( & x).
Trang 6Thao tác với con trỏ
Trang 7Thao tác với con trỏ
void main()
{
int x = 10, y = 15;
int *px, *py;
px = &x; //px = địa chỉ của x
py = &y; //py = địa chỉ của y
*py = 20; //giá trị trỏ bởi py = 20
*px = *py; //gtrị trỏ bởi px= gtrị trỏ bởi py
px = py; //phép gán con trỏ
*px = 30; //giá trị trỏ bởi px = 30
Trang 8Thao tác với con trỏ
Trang 9Thao tác với con trỏ
Con trỏ NULL:
• Con trỏ không chứa địa chỉ của bất kỳ vùng nhớ nào.
• Nên khởi tạo giá trị NULL hoặc địa chỉ của vùng nhớ nào đó cho biến trỏ lúc khai báo.
Trang 10Các phép toán với con trỏ
Tăng, giảm con trỏ (++ hoặc )
Cộng, trừ 1 số nguyên với 1 con trỏ
Con trỏ có thể trừ lẫn nhau (cộng, trừ với con trỏ
là vô nghĩa trừ khi dùng cho con trỏ mảng)
Ví dụ: Mảng p có 5 phần tử kiểu int (4 byte)
p trỏ đến phần tử đầu tiên p[0], tại địa chỉ 5000.p+=3; //trỏ đến phần tử thứ 4 p[3], tại địa chỉ5012
p ; //trỏ đến phần tử thứ 3 p[2], tại địa chỉ 5008
Trang 11Các phép toán với con trỏ
Gán con trỏ (Pointer assignment):
• Một con trỏ có thể được gán cho con trỏ khác nếu cả 2 cùng kiểu.
• Nếu không cùng kiểu thì phải ép kiểu (cast).
So sánh con trỏ (Pointer comparison):
• Sử dụng các toán tử quan hệ để so sánh địa chỉ chứa trong con trỏ.
• Thường dùng để xác định khi con trỏ = NULL.
Trang 12Truyền tham số con trỏ cho hàm
Trong phần khai báo và định nghĩa hàm, khai báo
Trong lời gọi hàm, ta phải cung cấp biểu thức có trị
Trang 13Con trỏ và mảng
Con trỏ và mảng có mối quan hệ chặt chẽ:
Tên mảng cũng như hằng con trỏ (constant pointer).
Có thể dùng chỉ số đối với các con trỏ.
Trang 14int x = *pa; //copy content of a[0] to x
int y = *(pa+1); //copy content of a[1] to y
Trang 15Con trỏ và mảng
a là địa chỉ của a[0]
pa = &a[0]; có thể viết: pa = a;
*(a+i) == *(pa+i)
Trang 169 void getArray(int *a, int size){
10 for(int i=0; i<size; i++) {
11 printf(“a[%d]=“, i);
12 scanf(“%d”, &a[i]);
Trang 17Mảng con trỏ
Kiểu phần tử của biến mảng có thể là kiểu con trỏ Các biến có địa chỉ chứa trong các phần tử mảng con trỏ là một mảng, nhưng có vùng nhớ không liên tục.
Thường dùng để lưu mảng của chuỗi.
Ví dụ: char * s[5] = {“Orange”, “Mango”,
“Coconut”, “Longan”, “Banana”};
Mỗi phần tử của s trỏ đến char * (1 chuỗi)
Trang 20Con trỏ đa cấp
Bản thân biến trỏ cũng có địa chỉ, do đó, có thểchứa địa chỉ của nó trong 1 biến trỏ khác, gọi làcon trỏ trỏ đến con trỏ, hay con trỏ 2 cấp
Số lượng dấu “*” xác định cấp của 1 biến trỏ
Con trỏ 2 cấp có liên quan mật thiết với mảng 2chiều
Ví dụ:
int a[2][3];
int **p = new int *[2];
p[0] = a[0];
Trang 21Cấp phát động
Cấp phát tĩnh: Cấp phát vùng nhớ lúc biên dịch
chương trình
Cấp phát động: Cấp phát vùng nhớ lúc thựchiện chương trình
Vùng nhớ của các đối tượng (biến) cấp phátđộng sẽ được đặt tại HEAP
Trong C, dùng các hàm malloc, calloc, realloc,
… được khai báo trong thư viện <alloc.h>,
Trang 22 void *: có thể cấp phát vùng nhớ cho kiểu dữ liệu bất kỳ.
VD:int* pi;
int size = 5;
pi = (int*)malloc(size * sizeof(int));
Trang 24Cấp phát động
Trong C++, dùng toán tử new:
Để cấp phát vùng nhớ trên HEAP có kích thước = sizeof(<type>)
<biến> = new <type>;
Để cấp phát vùng nhớ trên HEAP có kích thước = sizeof(<type>) * n
<biến> = new <type> [n];
Ví dụ:
int *x = new int;
int *a = new int [5];
Trang 25void free (void *ptr);
Trang 27void randomInit(int* a, int n);
void output(int* a, int n);
Trang 30void randomInit(int** a, int m, int n);
void output(int** a, int m, int n);
Trang 31cout << "Cho biet so dong ? : "; cin >> m;
cout << "Cho biet so cot ? : "; cin >> n;
a = new int * [m];
for (int i = 0; i < m; i++)
a[i] = new int [n];
randomInit(a, m, n);
Trang 33Con trỏ hàm
Trong C/C++, tên hàm là địa chỉ vùng nhớ củachỉ thị đầu tiên của hàm, do đó ta có thể gán giátrị địa chỉ này cho 1 biến trỏ có kiểu cùng kiểuvới kiểu giá trị trả về của hàm Đó gọi là con trỏhàm
Có thể gọi thực hiện một cách gián tiếp một hàmnào đó thông qua con trỏ hàm
Hàm có thể được dùng làm tham số cho mộthàm khác nhờ vào con trỏ hàm
Trang 34Con trỏ hàm
Ví dụ: Giả sử có các khai báo:
int a, b;
void swap(int * px, int * py);
void (* pf)(int *, int *);
pf = swap();
pf (&a, &b);
Trang 36Bài tập
- Tính tổng các phần tử trong mảng
- Tính giá trị trung bình của mảng
- Sắp xếp mảng theo thứ tự tăng dần, giảm dần
- Sắp xếp mảng theo thứ tự tăng dần và loại bỏ
các phần tử trùng nhau
- Liệt kê các phần tử là số chẵn, số lẻ, số âm, số
dương, số nguyên tố
- Đếm số lượng các phần tử là số chẵn, số lẻ,
số âm, số dương, số nguyên tố
Viết chương trình áp dụng các hàm trên
Trang 39Bài tập
5 Viết chương trình xử lý chuỗi ký tự gồm các chức
năng sau: (Dùng con trỏ để cài đặt, không dùng hàm thư viện)
- Tính chiều dài của chuỗi nhập vào.
- Sao chép 2 chuỗi với nhau.
- So sánh 2 chuỗi với nhau.
- Tìm 1 ký tự trong chuỗi nhập.
- Tìm chuỗi con trong chuỗi nhập.
- Thêm chuỗi con vào chuỗi nhập tại vị trí k.
Trang 40Bài tập
- Đảo ngược chuỗi nhập
- Kiểm tra 2 chuỗi nhập có bằng nhau?
- Kiểm tra chuỗi nhập có đối xứng?
- Đếm tần số xuất hiện của các ký tự trong chuỗi
nhập
- Đếm số từ trong chuỗi nhập
6 Viết chương trình nhập vào danh sách các từ
tiếng Anh, sắp xếp các từ theo thứ tự tăngdần