Professional Documents
Culture Documents
NMLT C13 ConTroNangCao in
NMLT C13 ConTroNangCao in
&& &&
VC
VC
BB
BB
Con trỏ cấp 2 (con trỏ đến con trỏ) VC
VC
BB
BB
Con trỏ cấp 2
int *p int n
Đặt vấn đề 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
void CapPhat(int *p, int n)
{ … N 00
22 U 00
L 00
L 02 00 00 00 …
p = (int *)malloc(n * sizeof(int));
}
void main()
{ CapPhat int *p int n
int *a = NULL;
CapPhat(a, 2); NULL 2
// a vẫn = NULL
} 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… N U L L …
Làm sao thay đổi giá trị của con trỏ (không
phải giá trị mà nó trỏ đến) sau khi gọi hàm? 3 int *a = NULL 4
NMLT - Con trỏ nâng cao NMLT - Con trỏ nâng cao
&& &&
VC
VC
BB
BB
Con trỏ cấp 2 VC
VC
BB
BB
Con trỏ cấp 2
&& &&
VC
VC
BB
BB
Con trỏ cấp 2 VC
VC
BB
BB
Con trỏ cấp 2
int **p int n
18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
Lưu ý
int x = 12;
… 0B 00 00 00 02 00 00 00 … int *ptr = &x; // OK
int k = &x; ptr = k; // Lỗi
int *a = NULL NMLT - Con trỏ nâng cao 7 NMLT - Con trỏ nâng cao 8
&& &&
VC
VC
BB
BB
Con trỏ và mảng 2 chiều VC
VC
BB
BB
Con trỏ và mảng 2 chiều
+1
0 1 2 3 1 2
a 0
0 1 2 3 4 5 6 7 8 9 10 11
1
int a[3][4]
2 int[4]
NMLT - Con trỏ nâng cao 9 NMLT - Con trỏ nâng cao 10
&& &&
VC
VC
BB
BB
Hướng tiếp cận 1 VC
VC
BB
BB
Hướng tiếp cận 1
Nhập / Xuất theo chỉ số mảng 1 chiều Liên hệ giữa chỉ số mảng 1 chiều và chỉ số
#define D 3 mảng 2 chiều
#define C 4
void main() (d, c) Î i ?
{ i = d*C + c
int a[D][C], i;
int *p = (int *)a; 0 1 2 3 4 5 6 7 8 9 10 11
for (i = 0; i < D*C; i++)
{ aCxD 0
printf(“Nhap phan tu thu %d: ”, i); 1
scanf(“%d”, p + i); i Î (d, c) ?
} 2
d=i/C
c=i%C
for (i = 0; i < D*C; i++)
printf(“%d ”, *(p + i));
} NMLT - Con trỏ nâng cao 11 NMLT - Con trỏ nâng cao 12
&& &&
VC
VC
BB
BB
Hướng tiếp cận 1 VC
VC
BB
BB
Con trỏ và mảng 2 chiều
&& &&
VC
VC
BB
BB
Hướng tiếp cận 2 VC
VC
BB
BB
Hướng tiếp cận 2
&& &&
VC
VC
BB
BB
Hướng tiếp cận 2 VC
VC
BB
BB
Hướng tiếp cận 2
NMLT - Con trỏ nâng cao 21 NMLT - Con trỏ nâng cao 22
&& &&
VC
VC
BB
BB
Mảng con trỏ VC
VC
BB
BB
Mảng con trỏ
array NMLT - Con trỏ nâng cao 23 NMLT - Con trỏ nâng cao 24
&& &&
VC
VC
BB
BB
Con trỏ hàm VC
VC
BB
BB
Con trỏ hàm
&& &&
VC
VC
BB
BB
Con trỏ hàm VC
VC
BB
BB
Con trỏ hàm
Khai báo không tường minh (thông qua kiểu) Gán giá trị cho con trỏ hàm
typedef <kiểu trả về> (* <tên kiểu>)(ds tham số); <biến con trỏ hàm> = <tên hàm>;
<tên kiểu> <tên biến con trỏ>; <biến con trỏ hàm> = &<tên hàm>;
So sánh con trỏ hàm Gọi hàm thông qua con trỏ hàm
if (tinhtoan != NULL) Sử dụng toán tử lấy nội dung “*” (chính quy)
{
if (tinhtoan == &Cong) nhưng trường hợp này có thể bỏ
printf(“Con trỏ đến hàm Cong.”); int Cong(int x, int y);
else int Tru(int x, int y);
if (tinhtoan == &Tru)
printf(“Con trỏ đến hàm Tru.”); int (*tinhtoan)(int, int);
else
printf(“Con trỏ đến hàm khác.”); tinhtoan = Cong;
} int kq1 = (*tinhtoan)(1, 2); // Chính quy
else int kq2 = tinhtoan(1, 2); // Ngắn gọn
printf(“Con trỏ chưa được khởi tạo!”);
NMLT - Con trỏ nâng cao 29 NMLT - Con trỏ nâng cao 30
&& &&
VC
VC
BB
BB
Con trỏ hàm VC
VC
BB
BB
Con trỏ hàm
Trả về con trỏ hàm (khai báo kiểu) Mảng con trỏ hàm
typedef (*PhepToan)(int, int); typedef (*PhepToan)(int, int);
PhepToan LayPhepToan(char code) void main()
{ {
if (code == ‘+’) int (*array1[2])(int, int); // tường minh
return &Cong; PhepToan array2[2]; // kô tường minh
return &Tru;
} array1[0] = array2[1] = &Cong;
array1[1] = array2[0] = &Tru;
void main()
{ printf(“%d\n”, (*array1[0])(1, 2));
PhepToan pheptoan = NULL; printf(“%d\n”, array1[1](1, 2));
pheptoan = LayPhepToan(‘+’); printf(“%d\n”, array2[0](1, 2));
int kq2 = pheptoan(1, 2, &Tru); printf(“%d\n”, array2[1](1, 2));
} }
NMLT - Con trỏ nâng cao 33 NMLT - Con trỏ nâng cao 34
&& &&
VC
VC
BB
BB
Con trỏ hàm VC
VC
BB
BB
Bài tập lý thuyết
NMLT - Con trỏ nâng cao 35 NMLT - Con trỏ nâng cao 36
&& &&
VC
VC
BB
BB
Bài tập lý thuyết VC
VC
BB
BB
Bài tập lý thuyết
Câu 5: Viết đoạn lệnh khai báo biến x kiểu float, Câu 9: Xét xem biểu thức so sánh nào sau đây
khai báo và khởi tạo con trỏ px đến biến x và đúng
khai báo và khởi tạo con trỏ ppx đến con trỏ px. array[0][0] == & array[0][0][0];
Câu 6: Ta muốn gán 100 cho x thông qua con array[0][1] == array[0][0][1];
trỏ ppx bằng biểu thức gán “ppx = 100;” có được array[0][1] == &array[0][1][0];
không?
Câu 10: Viết nguyên mẫu của một hàm nhận
Câu 7: Giả sử ta khai báo mảng array 3 chiều int một mảng con trỏ đến kiểu char làm đối số, và
array[2][3][4]. Cho biết cấu trúc của mảng này giá trị trả về có kiểu void.
đối với trình biên dịch C.
Câu 11: Theo cách viết của câu 10, ta có thể
Câu 8: Cho biết array[0][0] có nghĩa là gì? biết được số phần tử của mảng được truyền kô?
NMLT - Con trỏ nâng cao 37 NMLT - Con trỏ nâng cao 38
&& &&
VC
VC
BB
BB
Bài tập lý thuyết VC
VC
BB
BB
Bài tập lý thuyết
Câu 12: Con trỏ đến hàm là gì? Câu 16: Cho biết ý nghĩa của các khai báo sau:
Câu 13: Viết khai báo con trỏ đến một hàm mà int a[3][12];
hàm đó có giá trị trả về kiểu char, nhận đối số là int (*b)[12];
một mảng con trỏ đến kiểu char. int *c[12];
Câu 14: Ta viết khai báo con trỏ ở câu 12 như Câu 17: Cho biết ý nghĩa của các khai báo sau:
vậy có đúng không? char *ptr(char *x[]);
char *z[10];
Câu 15: Cho biết ý nghĩa của các khai báo sau:
char *y(int field);
int *var1;
char (*x)(int field);
int var2;
int **var3;
NMLT - Con trỏ nâng cao 39 NMLT - Con trỏ nâng cao 40
&& &&
VC
VC
BB
BB
Bài tập lý thuyết VC
VC
BB
BB
Bài tập thực hành
Câu 18: Viết khai báo con trỏ func đến một hàm Câu 21: Tìm lỗi sai trong đoạn lệnh sau
nhận đối số là một số nguyên và trả về giá trị int x[3][12];
kiểu float. int *ptr[12];
Câu 19: Viết khai báo một mảng con trỏ đến ptr = x;
hàm. Các hàm nhận một chuỗi ký tự làm tham
số và trả về giá trị kiểu nguyên. Ta có thể sử Câu 22: Viết chương trình khai báo mảng hai
dụng mảng này để làm gì? chiều có 12x12 phần tử kiểu char. Gán ký tự ‘X’
cho mọi phần tử của mảng này. Sử dụng con trỏ
Câu 20: Viết câu lệnh khai báo một mảng 10 con đến mảng để in giá trị các phần tử mảng lên
trỏ đến kiểu char. màn hình ở dạng lưới.
NMLT - Con trỏ nâng cao 41 NMLT - Con trỏ nâng cao 42
&& &&
VC
VC
BB
BB
Bài tập thực hành VC
VC
BB
BB
Bài tập thực hành
Câu 23: Viết chương trình khai báo mảng 10 Câu 25: Chương trình cho phép người dùng
con trỏ đến kiểu float, nhận 10 số thực từ bàn nhập các dòng văn bản từ bàn phím đến khi
phím, sắp xếp lại và in ra màn hình dãy số đã nhập một dòng trống. Chương trình sẽ sắp xếp
sắp xếp. các dòng theo thứ tự alphabet rồi hiển thị chúng
Câu 24: Sửa lại bài tập 22 để người sử dụng có ra màn hình.
thể lựa chọn cách sắp xếp theo thứ tự tăng hay Câu 26: Sử dụng con trỏ hàm để viết các hàm
giảm dần. sắp xếp sau
Tăng dần
Giảm dần
Dương giảm rồi âm tăng, cuối cùng là số 0
NMLT - Con trỏ nâng cao 43 … 44
NMLT - Con trỏ nâng cao