Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
825,37 KB
Nội dung
Trịnh Thành Trung (ThS) trungtt@soict.hust.edu.vn Bài C/C++ nâng cao Nội dung Con trỏ Quản lý nhớ Hàm tham số Đa hóa Con trỏ Pointer Con trỏ Pointer ▪ Khái niệm ▫ Giá trị biến lưu trữ nhớ máy tính, truy cập tới giá trị qua tên biến, đồng thời qua địa chúng nhớ ▪ Thực chất biến mà nội dung địa đối tượng khác (biến, hàm, số) ▫ Việc sử dụng trỏ cho phép ta truy nhập tới đối tượng gián tiếp qua địa ▪ Có nhiều kiểu biến với kích thước khác nhau, nên có nhiều kiểu trỏ ▫ Ví dụ: Con trỏ int để trỏ tới biến hay hàm kiểu int Con trỏ Pointer ▪ Khai báo trỏ : ▫ Syntax : dataType * PointerName; Chỉ trỏ ▪ Sau khai báo, ta trỏ NULL (chưa trỏ tới đối tượng nào) ▫ Để sử dụng trỏ, ta dùng toán tử lấy địa & PointerName = &VarName Ví dụ int a; int *p; a=10; p= &a; ▫ Để lấy nội dung biến trỏ trỏ tới, ta dùng toán tử lấy nội dung * * PointerName Ví dụ int i,j,*p; i= 5; p= & i; j= *p; *p= j+2; 100 Gán i=5 j 104 p 100 gán p = & i i *p = j+2 gán j = *p 102 j 104 100 p i 102 j 104 p 100 i 102 100 102 i j 104 100 p 100 i 102 j 104 100 p Chú ý ▪ Một trỏ trỏ tới đối tượng kiểu ▪ Tốn tử ngơi * & có độ ưu tiên cao tốn tử số học ▪ Ta viết *p cho nơi có đối tượng mà trỏ tới xuất int x = 5, *p; p = & x; x=x+10; ~ *p = *p+10; ▪ Ta gán nội dung trỏ cho nhau: hai trỏ trỏ tới đối tượng int x=10, *p, *q; p = &x; q = p; => p q trỏ tới x Thứ tự ưu tiên phép toán Các phép toán trỏ ▪ Cộng trừ với số nguyên n trả trỏ kiểu, địa trỏ tới đối tượng khác nằm cách đối tượng bị trỏ n phần tử ▪ Trừ trỏ cho ta khoảng cách (số phần tử) trỏ ▪ KHƠNG có phép cộng, nhân, chia trỏ ▪ Có thể dùng phép gán, so sánh trỏ ▫ Chú ý đến tương thích kiểu Ví dụ char *pchar; short *pshort; long *plong; pchar ++; pshort ++; plong ++; Giả sử địa ban đầu tương ứng trỏ 100, 200 300, kết ta có giá trị 101, 202 304 tương ứng Nếu viết tiếp plong += 5; pchar -=10; pshort +=5; => => => plong = 324 pchar = 91 pshort = 212 Chú ý ++ có độ ưu tiên cao * nên *p++ tương đương với *(p++) tức tăng địa mà trỏ tới khơng phải tăng giá trị mà chứa *p++ = *q++ tương đương với *p = *q; p=p+1; q=q+1; ++*p = ++*q; //??? Dùng ( ) để tránh nhầm lẫn Con trỏ void* ▪ Là trỏ không định kiểu Nó trỏ tới loại biến ▪ Thực chất trỏ void chứa địa nhớ mà địa có đối tượng kiểu liệu => khơng thể truy cập nội dung đối tượng thông qua trỏ void ▪ Để truy cập đối tượng trước hết phải ép kiểu biến trỏ void thành biến trỏ có định kiểu kiểu đối tượng Con trỏ void* float x; int y; void *p; // khai báo trỏ void p = &x; // p chứa địa số thực x *p = 2.5; // báo lỗi p trỏ void /* cần phải ép kiểu trỏ void trước truy cập đối tượng qua trỏ */ *((float*)p) = 2.5; // x = 2.5 p = &y; // p chứa địa số nguyên y *((int*)p) = 2; // y = Ví dụ (float) *p=2.5; *p= (float *) 2.5; *(float)p =2.5; (float *) p =2.5; (float *) *p=2.5; *((float *) p )=2.5; Con trỏ mảng ▪ Giả sử ta có int a[30]; &a[0] địa phần tử mảng đó, đồng thời địa mảng ▪ Trong C, tên mảng địa = địa phần tử mảng a = &a[0]; a+i = &a[i]; Con trỏ mảng ▪ Tuy cần ý a => dùng câu lệnh gán hay tốn tử tăng, giảm a++; ▪ Xét trỏ: int *pa; pa = &a[0]; => pa trỏ vào phần tử thứ mảng ▪ pa +1 trỏ vào phần tử thứ mảng ▪ *(pa+i) nội dung a[i] Con trỏ xâu ▪ Ta có char tinhthanh[30] =“Da Lat”; ▪ Tương đương : char *tinhthanh; tinhthanh=“Da lat”; ▪ Hoặc : char *tinhthanh =“Da lat”; ▪ Ngoài thao tác xâu tương tự mảng *(tinhthanh+3) = “l” ▪ Chú ý : với xâu thường khơng thể gán trực tiếp dòng thứ Mảng trỏ ▪ Con trỏ loại liệu nên ta tạo mảng phần tử trỏ theo dạng thức *[]; ▪ Ví dụ: char *ds[10]; ▫ ds mảng gồm 10 phần tử, phần tử trỏ kiểu char, dùng để lưu trữ 10 xâu ký tự ▪ Cũng có thẻ khởi tạo trực tiếp giá trị khai báo char * ma[10] = {“mot”,”hai”,”ba” }; Chú ý ▪ Cần phân biệt mảng trỏ mảng nhiều chiều ▪ Mảng nhiều chiều mảng thực khai báo có đủ vùng nhớ dành sẵn cho phần tử ▪ Mảng trỏ dành không gian nhớ cho biến trỏ (chứa địa chỉ) Khi khởi tạo hay gán giá trị: cần thêm nhớ cho phần tử sử dụng => tốn nhiều Mảng trỏ ▪ Một ưu điểm khác mảng trỏ ta hốn chuyển đối tượng (mảng con, cấu trúc ) trỏ trỏ cách hoán chuyển trỏ ▪ Ưu điểm việc truyền tham số hàm ▪ Ví dụ: Vào danh sách lớp theo họ tên, sau xếp để in theo thứ tự ABC #include #include #define MAXHS 50 #define MAXLEN 30 ... *((float*)p) = 2. 5; // x = 2. 5 p = &y; // p chứa địa số nguyên y *((int*)p) = 2; // y = Ví dụ (float) *p =2. 5; *p= (float *) 2. 5; *(float)p =2. 5; (float *) p =2. 5; (float *) *p =2. 5; *((float *) p ) =2. 5;... i,j,*p; i= 5; p= & i; j= *p; *p= j +2; 100 Gán i=5 j 104 p 100 gán p = & i i *p = j +2 gán j = *p 1 02 j 104 100 p i 1 02 j 104 p 100 i 1 02 100 1 02 i j 104 100 p 100 i 1 02 j 104 100 p Chú ý ▪ Một trỏ... ban đầu tương ứng trỏ 100, 20 0 300, kết ta có giá trị 101, 20 2 304 tương ứng Nếu viết tiếp plong += 5; pchar -=10; pshort +=5; => => => plong = 324 pchar = 91 pshort = 21 2 Chú ý ++ có độ ưu tiên