Ngôn ngữ lập trình - Con trỏ

Chia sẻ: Quyen Duy | Ngày: | Loại File: PPT | Số trang:25

0
591
lượt xem
276
download

Ngôn ngữ lập trình - Con trỏ

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu về công nghệ thông tin - con trỏ

Chủ đề:
Lưu

Nội dung Text: Ngôn ngữ lập trình - Con trỏ

  1. Lập trình C++ 1 1
  2. Con trỏ Biến và con trỏ 1. Cấp phát và giải phóng bộ nhớ động 2. Mô hình bộ nhớ chương trình 3. Quan hệ giữa mảng và con trỏ 4. Phân biệt tham chiếu và con trỏ 5. Mảng con trỏ. Con trỏ cấu trúc. Con trỏ void 6. Con trỏ làm đối số trong hàm 7. Review 8. Bài tập 9. 2
  3. Biến và con trỏ Khai báo  int a = 5; // a là biến chứa giá trị int  // p là con trỏ int, p là biến chứa địa chỉ int *p;  // 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 3
  4. Biến và con trỏ Mô tả:  int a = 5; // a là biến chứa giá trị int 1. // p là con trỏ int, p là biến chứa địa chỉ int *p; 2. p = &a; // p trỏ đến a 3. *p = 7; // gán giá trị qua p 4. a a a 1. Cấp ô 1001 1001 1001 5 5 7 nhớ cho a p p p 2. Cấp ô 1100 1001 1100 1001 1100 nhớ cho p 3. p chứa địa chỉ 4. gán giá trị vào ô của biến a nhớ có địa chỉ trong p 4
  5. Biến và con trỏ Cho biết kết quả trên màn hình:  int a = 5;  int *p;  p = &a;  cout
  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ỏ  6
  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;  // cấp phát ô nhớ cỡ int p = new 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  7
  8. Cấp phát và giải phóng bộ nhớ động Ví dụ:  // biến động  int *p = new int(5); // cấp phát ô nhớ  cout
  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. // giải phóng vùng nhớ do p trỏ đến  delete p;  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). 9
  10. Cấp phát và giải phóng bộ nhớ động Cho biết kết quả của đoạn chương trình sau:  int *p, *q;  p = new int(1);  q = new int(2);  cout
  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. 11
  12. Mô hình bộ nhớ chương trình Thử nghiệm:  #include  int g;  void test(int x)  { int c;  cout
  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]... 13
  14. Mảng và con trỏ Cho biết kết quả của đoạn chương trình sau:  int x[5] = {5, 3, 4, 8, 9};   int *p = x;  *p = 1;  *(p+1) = 7;  p[2] = 15;  x[3] = p[3] + 2;  for(int i=0; i
  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
  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ỏ  int i;  for(i=0; i
  17. Con trỏ cấu trúc Ví dụ cấu trúc Hàng hoá  struct Hanghoa  {  int soluong;  float dongia;  };  ...  Hanghoa x;  Hanghoa *p, *q;  p = &x;  q = new Hanghoa;  // giống (*q).soluong = 7; q->soluong = 7;  q->dongia = 20.50; // giống (*q).dongia = 20.50;  17
  18. Con trỏ đối tượng Ví dụ lớp Sinh viên  class Sinhvien  {  private:  ...  float dtb;  public:  void DatDTB(float d) { dtb = d; }  };  ...  Sinhvien *p = new Sinhvien;  p->DatDTB(8.7); // giống (*p).DatDTB(8.7);  18
  19. Con trỏ đối tượng Ví dụ lớp Hình tròn  class Hinhtron  {  private:  int bankinh;  public:  Hinhtron(int a) { bankinh = a; }  float LayDientich() { return 3.14*bankinh*bankinh; }  };  ...  Hinhtron *p = new Hinhtron(4); // tạo hình tròn có đối số  coutLayDientich(); // giống (*p).LayDientich();  19
  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. void* p;  // p trỏ đến một vùng nhớ kiểu int p = new int(4);  coutDatDTB(8.7); // ép kiểu Sinhvien  p = new Hinhtron(4); // p trỏ đến một vùng nhớ kiểu Hinhtron  coutLayDientich(); // ép kiểu Hinhtron  20

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản