Bài giảng Phương pháp lập trình - Chương 5: Con trỏ (Pointer)

1. Địa chỉ 2. Khái niệm và khai báo biến con trỏ 3. Toán tử con trỏ 4. Các thao tác trên biến con trỏ 5. Cấp phát và giải phóng bộ nhớ 6. Con trỏ và mảng 7. Mảng con trỏ

ppt46 trang | Chia sẻ: candy98 | Lượt xem: 533 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Phương pháp lập trình - Chương 5: Con trỏ (Pointer), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CON TRỎ (Pointer)Chương 5Nội dung trình bàyĐịa chỉKhái niệm và khai báo biến con trỏToán tử con trỏ Các thao tác trên biến con trỏCấp phát và giải phóng bộ nhớCon trỏ và mảngMảng con trỏ21. Địa chỉ (Address)Mỗi biến đều có 2 thuộc tính: địa chỉ (address) và giá trị (value)Ví dụ: int i=11, j=22, k=33; Trong bộ nhớ: + Tại địa chỉ 53AD78 có giá trị là 11 + Tại địa chỉ 53AD7C có giá trị là 22 + Tại địa chỉ 53AD80 có giá trị là 33Để lấy địa chỉ của 1 biến: dùng dấu & trước tên biến. Ví dụ:3Nội dung trình bàyĐịa chỉKhái niệm và khai báo biến con trỏToán tử con trỏ Các thao tác trên biến con trỏCấp phát và giải phóng bộ nhớCon trỏ và mảngMảng con trỏ42. Khái niệm và khai báo con trỏKhái niệm con trỏ: Là một biến mà giá trị của nó chứa một địa chỉCách khai báo biến con trỏ: tương tự khai báo biến thông thường, có thêm dấu * vào trước tên biếnVí dụ: int *ia; int x, *p, *q;Không được dùng biến con trỏ khi con trỏ chưa được khởi tạo giá trịGiá trị gán cho con trỏ phải là một địa chỉ, ví dụ:p = &x;52. Khái niệm và khai báo con trỏ: Ví dụ int i=11, j=22, k=33; int *iPtr, *jPtr, *kPtr; iPtr = &i; jPtr = &j; Vậy: nếu gán iPtr = i  là sai6iPtr, jPtr là 2 biến con trỏ lần lượt chứa địa chỉ của i, jNội dung trình bàyĐịa chỉKhái niệm và khai báo biến con trỏToán tử con trỏ Các thao tác trên biến con trỏCấp phát và giải phóng bộ nhớCon trỏ và mảngMảng con trỏ73. Toán tử con trỏToán tử * : lấy giá trị tại địa chỉ chứa trong biến con trỏVí dụ: int i; int *ia; i = 10; ia = &i; cout#include void main (){int a = 20, b = 15, *pa, *pb, temp;pa = &a; // con trỏ pa chứa địa chỉ của apb = &b; // con trỏ pb chứa địa chỉ của btemp = *pa;*pa = *pb;*pb = temp;cout void main() { int *p;p = new int; // cấp phát vùng nhớ cho p*p = 100;cout void main(){ int a[] = {0,1,2,3,4,5,6,7,8,9}; int *p; p = a; for( int i=0 ; i#include void main (){ int numbers[5], * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n=&353. Toán tử con trỏ (pointer operators)Ví dụ: a25xy25int a=25, x;int *y;x=a;y=&a; y361. Giới thiệu con trỏKhi khai báo: int a; hoặc float X[100]; thì a và X có kích thước và kiểu dữ liệu xác định, gọi là biến tĩnhCác biến tĩnh sẽ tồn tại trong suốt thời gian thực thi chương trìnhCác biến tĩnh sẽ được cấp phát vùng nhớ ngay sau khi được khai báo mà không cần biết nó có được sử dụng hết trong chương trình hay khôngCấp phát ô nhớ dư, gây ra lãng phí ô nhớCấp phát ô nhớ thiếu, chương trình thực thi bị lỗi371. Giới thiệu con trỏĐể tránh những hạn chế trên, C/C++ cung cấp dữ liệu kiểu con trỏ (pointer) với các đặc điểm:Chỉ cấp phát trong quá trình thực hiện chương trình Khi chạy chương trình, kích thước của biến, vùng nhớ và địa chỉ vùng nhớ được cấp phát cho biến có thể thay đổiSau khi sử dụng xong có thể giải phóng để tiết kiệm chỗ trong bộ nhớKích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, luôn có kích thước cố định là 2 bytes (tùy thuộc vào hệ điều hành)385. Cấp phát bộ nhớ độngHàm malloc(): cấp phát bộ nhớ động. Prototype của hàm có dạngvoid *malloc(length) length: là số byte muốn cấp phát. Hàm malloc() trả về một con trỏ có kiểu void, do đó có thể gán nó cho con trỏ có kiểu bất kỳ. Sau khi cấp phát thành công, hàm malloc() trả về địa chỉ của byte đầu tiên của vùng nhớ được cấp phát từ heap. Nếu không thành công (không có đủ vùng nhớ rỗi yêu cầu), hàm malloc() trả về null.395. Cấp phát bộ nhớ độngKích thước của heap không xác định nên khi cấp phát bộ nhớ phải kiểm tra giá trị trả về của hàm malloc() để biết là bộ nhớ có được cấp phát thành công hay không. Ví dụ:p = (int *)malloc(100);if(p == NULL){ cout Ví dụ: #include void main(){ int *p; cout <<“Gia tri con tro p tro den la: “<< *p; }Kết quả của chương trình trên là:NULL POINTER ASSIGNMENT46