1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Ngôn ngữ lập trình - Con trỏ ppt

25 1,4K 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Con trỏ
Thể loại Bài thuyết trình
Định dạng
Số trang 25
Dung lượng 148,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cấp phát và giải phóng bộ nhớ động 3.. Cấp phát và giải phóng bộ nhớ động Biến tĩnh  Là biến được cấp vùng nhớ ngay khi lời khai báo được thực hiện  Tự động mất đi khi ra khỏi phạm vi

Trang 1

Lập trình C++ 1

Trang 2

Con trỏ

1 Biến và con trỏ

2 Cấp phát và giải phóng bộ nhớ động

3 Mô hình bộ nhớ chương trình

4 Quan hệ giữa mảng và con trỏ

5 Phân biệt tham chiếu và con trỏ

6 Mảng con trỏ Con trỏ cấu trúc Con trỏ void

7 Con trỏ làm đối số trong hàm

8 Review

Bài tập

Trang 3

Biến và con trỏ

 Khai báo

int a = 5; // a là biến chứa giá trị int

int *p; // p là con trỏ int, p là biến chứa địa chỉ

// của ô nhớ kiểu int

 Truy nhập ô nhớ

p = &a; // toán tử & cho phép lấy địa chỉ của một biến,

// p chứa địa chỉ của biến a

*p = 7; // toán tử * cho phép truy nhập giá trị ô nhớ

// thông qua địa chỉ, giá trị của ô nhớ có địa // chỉ trong p được gán giá trị 7

Trang 4

Biến và con trỏ

 Mô tả:

1. int a = 5; // a là biến chứa giá trị int

2. int *p; // p là con trỏ int, p là biến chứa địa chỉ

Trang 6

Cấp phát và giải phóng bộ nhớ động

 Biến tĩnh

 Là biến được cấp vùng nhớ ngay khi lời khai báo được thực hiện

 Tự động mất đi khi ra khỏi phạm vi khai báo

 Biến tĩnh thường được sử dụng thông qua tên biến

 Biến động

 Là biến được cấp vùng nhớ bất kì khi nào chương trình yêu cầu

 Bị mất đi khi chương trình giải phóng vùng nhớ

 Biến động thường được sử dụng thông qua con trỏ

Trang 7

Cấp phát và giải phóng bộ nhớ động

Toán tử new: Cấp phát vùng nhớ

 int *p, *q, *r;

p = new int; // cấp phát ô nhớ cỡ int

q = new int(5); // cấp phát đồng thời khởi tạo giá trị

r = new int[8]; // cấp phát mảng động

Toán tử delete: Giải phóng vùng nhớ

delete p; // giải phóng vùng nhớ do p trỏ đến

delete[] r; // giải phóng mảng động

Trang 8

int *r = new int[7]; // cấp phát mảng động

 for(int i = 0; i<7; i++)

Trang 9

Cấp phát và giải phóng bộ nhớ động

 Chú ý: Khi giải phóng một vùng nhớ thì con trỏ trỏ đến vùng nhớ đó vẫn chứa địa chỉ của vùng nhớ, và như vậy việc truy nhập đến vùng nhớ đã giải phóng là không hợp lệ (về logic).

=> Khi giải phóng vùng nhớ, nên gán tất cả con trỏ trỏ đến vùng nhớ đó bằng NULL.

delete p; // giải phóng vùng nhớ do p trỏ đến

p = NULL; // p không chứa địa chỉ của vùng nhớ nào,

// p không trỏ đến vùng nhớ nào

 Không giải phóng một vùng nhớ đã cấp phát sẽ dẫn đến hiện tượng rò bộ nhớ (memory leak).

Trang 11

Mô hình bộ nhớ chương trình

 Khi một chương trình được thực thi (execute),

nó có các vùng nhớ như sau:

 Vùng CODE: Chứa mã lệnh chương trình

 Vùng DATA: Chứa các biến toàn cục

 Vùng STACK: Chứa các biến cục bộ

 Vùng HEAP: Chứa các biến động

 Kích thước của vùng có thể được thiết đặt trước khi biên dịch.

Trang 12

 cout<<“Dia chi cua x la: “<< &x <<endl;

 cout<<“Dia chi cua c la: “<< &c <<endl;

 cout<<“Dia chi cua g la: ”<< &g <<endl;

 int *p = new int;

 cout<<“Dia chi p la: ”<< p <<endl;

Trang 13

Mảng và con trỏ

 Trong C++, mảng là con trỏ hằng trỏ đến một dãy ô nhớ.

 Ví dụ: int x[7]; int a; int *p;

 x là một mảng, x là con trỏ hằng trỏ đến ô nhớ đầu tiên của 7 ô nhớ được cấp phát

 Vì x là con trỏ hằng nên ta không thể thay đổi giá trị địa chỉ mà nó lưu giữ, ví dụ: x = &a;

 Vì p cũng là con trỏ nên ta có thể gán p = x;

 x trỏ đến ô nhớ đầu tiên, x+1 trỏ đến ô nhớ tiếp

theo Vậy ta có *(x+1) tương đương với x[1]

Trang 15

Con trỏ và tham chiếu

 Con trỏ và tham chiếu hoạt động gần giống

nhau song chúng khác nhau.

 Tham chiếu: Là bí danh của một biến.

 Con trỏ: Là biến chứa địa chỉ.

 Có thể tạo tham chiếu tới một biến động Ví dụ:

int *p = new int(3); // tạo biến động

int &x = *p; // tạo tham chiếu tới biến động

 cout<<x<<endl;

 cout<<&x<<endl<<p;

Trang 16

Mảng con trỏ

 Cho biết kết quả của đoạn chương trình sau:

int *r[5]; // khai báo mảng 5 con trỏ

Trang 17

q->soluong = 7; // giống (*q).soluong = 7;

q->dongia = 20.50; // giống (*q).dongia = 20.50;

Trang 18

Con trỏ đối tượng

 Sinhvien *p = new Sinhvien;

p->DatDTB(8.7); // giống (*p).DatDTB(8.7);

Trang 19

Con trỏ đối tượng

Hinhtron *p = new Hinhtron(4); // tạo hình tròn có đối số

cout<< p->LayDientich(); // giống (*p).LayDientich();

Trang 20

Con trỏ void

 Con trỏ void là con trỏ có thể trỏ đến bất kỳ đối tượng nào Khi muốn lấy giá trị của nó ta cần phải ép kiểu.

p = new int(4); // p trỏ đến một vùng nhớ kiểu int

cout<< *((int *) p); // ép kiểu để lấy giá trị int

p = new Hanghoa; // p trỏ đến một vùng nhớ kiểu Hanghoa

cout<< ((Hanghoa *) p)->soluong; // ép kiểu Hanghoa

p = new Sinhvien; // p trỏ đến một vùng nhớ kiểu Sinhvien

((Sinhvien *) p)->DatDTB(8.7); // ép kiểu Sinhvien

p = new Hinhtron(4); // p trỏ đến một vùng nhớ kiểu Hinhtron

Trang 24

1 Biến và con trỏ khác nhau thế nào ?

2 Phân biệt biến tĩnh và biến động ?

3 Nêu các vùng nhớ của chương trình ?

4 Trong C++, mảng là con trỏ như thế nào ?

5 Tham chiếu khác con trỏ như thế nào ?

6 Con trỏ void là gì ?

7 Nêu một số ví dụ về sử dụng con trỏ hàm ?

Trang 25

Bài tập về nhà

1 Sử dụng lớp Hinhtron để viết chương trình tạo

hình tròn (cấp phát động) với các lời gọi cấu tử khác nhau

2 Hoàn chỉnh lớp Sinhvien đã học với các

phương thức cần thiết.

3 Viết chương trình nhập một số N, sau đó tạo

mảng động N phần tử với giá trị là các số

Fibonacci In mảng ra màn hình và cuối cùng giải phóng mảng.

Ngày đăng: 24/01/2014, 19:20

HÌNH ẢNH LIÊN QUAN

Hình tròn (cấp phát động) với các lời gọi cấu tử  khác nhau. - Tài liệu Ngôn ngữ lập trình - Con trỏ ppt
Hình tr òn (cấp phát động) với các lời gọi cấu tử khác nhau (Trang 25)

TỪ KHÓA LIÊN QUAN

w