Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 55 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
55
Dung lượng
185,48 KB
Nội dung
BÀI GIẢNG KỸ THUẬT LẬP TRÌNH Nguyễn Duy Đỉnh 1 Tuần 9 - 10 – Con trỏ • Dữ liệu kiểu con trỏ • Các phép toán với con trỏ • Các lệnh cấp phát bộ nhớ • Mảng động • Truyền tham số mảng 2 Dữ liệu kiểu con trỏ • Bộ nhớ RAM là mỗi chuỗi các ô nhớ có địa chỉ xác định được đánh số từ 0x0000 • Địa chỉ của một ô nhớ là vị trí của nó trong bộ nhớ RAM • Địa chỉ tối đa phụ thuộc vào dung lượng nhớ. Ví dụ – RAM 256 Bytes có dải địa chỉ từ 0x00 đến 0xFF – RAM 1M có dải địa chỉ từ 0x0 0000 đến 0xF FFFF – RAM 1G có dải địa chỉ từ 0x0000 0000 đến 0x3FFF FFFF – • Bản đồ nhớ là cách bố trí các ô nhớ trong bộ nhớ RAM 3 Ví dụ, bản đồ nhớ của RAM 256 Bytes Địa chỉ ô nhớ màu vàng - 0x0B; đỏ - 0x14; xanh – 0x29 Mỗi ô nhớ chiếm 1 Byte bộ nhớ Dữ liệu kiểu con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 0x10 0x20 0xF0 4 Dữ liệu kiểu con trỏ • Các biến khi được khai báo sẽ chiếm một ví trí nào đó trong bộ nhớ RAM • Tên biến chính là cách mà ta gọi tên của ô nhớ • Chẳng hạn, ô nhớ màu vàng, màu đỏ, màu xanh là cách mà ta gọi tên các ô nhớ 0x0B, 0x14, 0x28 • Ví dụ: Bộ nhớ RAM có 256Bytes, nếu ta khai báo: short int a, b; a = 0x1234; b = a << 1; 5 Do biến a, b kiểu short int là kiểu dữ liệu 2 bytes nên mỗi biến a, b sẽ chiếm 2 bytes (2 ô) trong bản đồ nhớ của bộ nhớ RAM Chẳng hạn, giả sử bộ nhớ cấp cho a bắt đầu từ 0x0A bộ nhớ cấp cho b bắt đầu từ 0x12 Dữ liệu kiểu con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 0x10 0x20 0xF0 6 Do biến a, b kiểu short int là kiểu dữ liệu 2 bytes nên mỗi biến a, b sẽ chiếm 2 bytes (2 ô) trong bản đồ nhớ của bộ nhớ RAM Chẳng hạn, giả sử bộ nhớ cấp cho a bắt đầu từ 0x0A bộ nhớ cấp cho b bắt đầu từ 0x12 Dữ liệu kiểu con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 0x10 0x20 0xF0 7 Gán a = 0x1234, nghĩa là ghi các giá trị 12 và 34 vào các ô nhớ tương ứng: [0x0A] = 12 và [0x0B] = 34 Tương tự, gán b = a<<1; //b=2468, nghĩa là ghi các giá trị 24 và 68 vào các ô nhớ [0x12] = 24 và [0x13] = 68 Dữ liệu kiểu con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 34 12 0x10 68 24 0x20 0xF0 8 Trên thực tế, khi máy tính thực hiện chương trình, nó chỉ quan tâm đến địa chỉ ô nhớ và làm việc với địa chỉ ô nhớ a, b chẳng qua chỉ là tên mà người lập trình gọi ô nhớ sao cho thuận tiện khi lập trình Thông thường, ta chỉ quan tâm đến giá trị của các biến a, b mà không cần biết nó ở vị trí nào trong bản đồ nhớ Dữ liệu kiểu con trỏ 9 Tuy nhiên, trong rất nhiều trường hợp, địa chỉ và vùng bộ nhớ chiếm giữ của các biến này cũng rất quan trọng, giúp cho việc thực hiện thuật toán nhanh hơn, thuận tiện hơn, linh hoạt hơn Chẳng hạn, khi muốn thay đổi giá trị của tham số truyền vào một hàm khi muốn làm việc với các ô nhớ liên tiếp nhau trong bộ nhớ RAM (mảng) hoặc trên ổ cứng (tệp) khi muốn làm việc với danh sách liên kiết khi muốn sử dụng bộ nhớ một cách linh hoạt Dữ liệu kiểu con trỏ 10 [...]... biến con trỏ khi được khai báo sẽ nằm trong bộ nhớ Stack Bản thân mỗi biến con trỏ chiếm 4 Bytes bộ nhớ Tuy nhiên, vùng nhớ mà biến con trỏ quản lý là vùng nhớ nằm trong bộ nhớ Heap Bộ nhớ Heap thường lớn hơn nhiều so với bộ nhớ Stack Các phép toán với con trỏ Toán tử & và toán tử * Toán tử &: chỉ địa chỉ của một biến trong bản đồ nhớ Toán tử *: chỉ giá trị của ô nhớ có địa chỉ mà biến con. .. Ví dụ khai báo biến kiểu con trỏ: float *x, *y; FILE *f; char *s; x, y là các con trỏ kiểu float, lưu địa chỉ của các ô nhớ mà giá trị của các ô nhớ đó có kiểu kiểu float, hay x, y trỏ tới các phần tử kiểu float f con trỏ kiểu file, trỏ tới các tệp s con trỏ kiểu char, trỏ tới các phần tử kiểu char Dữ liệu kiểu con trỏ Các biến thông thường khi được khai báo sẽ nằm trong bộ nhớ Stack (có dung... biến a chiếm trong bộ nhớ *b: giá trị của ô nhớ mà con trỏ b trỏ tới &b: địa chỉ của ô nhớ mà biến con trỏ b chiếm Các phép toán với con trỏ Ví dụ: int a, b, *c; a = 0x1234; b = a . b = a<<1; //b=2 468 , nghĩa là ghi các giá trị 24 và 68 vào các ô nhớ [0x12] = 24 và [0x13] = 68 Dữ liệu kiểu con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 34 12 0x10 68 24 0x20 0xF0 8 Trên. Bytes) Các biến con trỏ khi được khai báo sẽ nằm trong bộ nhớ Stack Bản thân mỗi biến con trỏ chiếm 4 Bytes bộ nhớ Tuy nhiên, vùng nhớ mà biến con trỏ quản lý là vùng nhớ nằm trong bộ nhớ Heap. &a = 0x0A; &b = 0x12; Giả sử con trỏ c đang trỏ tới ô nhớ 0x12 thì: *c = 2 468 ; Các phép toán với con trỏ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00 34 12 0x10 68 24 0x20 0xF0 15 Phép gán: short