Bài giảng kỹ thuật lập trình bài 2 ths nguyễn thành trung

20 37 0
Bài giảng kỹ thuật lập trình  bài 2   ths  nguyễn thành trung

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 19/06/2019, 10:04

Tài liệu cùng người dùng

Tài liệu liên quan