1. Trang chủ
  2. » Trung học cơ sở - phổ thông

lap trinh C bai 8

27 8 0

Đ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

Định dạng
Số trang 27
Dung lượng 129,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

chiếu thì ta phải đặt ra câu hỏi “Tham chiếu sẽ là bí danh của đối tượng nào và nó có tồn tại mỗi khi tham chiếu được sử dụng không?”.[r]

Trang 1

Chương 8: Quản lý bộ nhớ

Trang 2

Nội dung chính

 Con trỏ (Pointer)

 Tham chiếu (Reference)

 Sử dụng tham chiếu hay con trỏ

Trang 3

1 Con trỏ

 Con trỏ được sử dụng để:

 Truy nhập vào các thành phần của mảng

 Truyền tham số cho hàm theo kiểu truyền biến

 Truyền mảng và xâu ký tự cho hàm

 Lấy thông tin từ bộ nhớ của hệ thống

 Tạo ra những cấu trúc dữ liệu như: danh sách liên kết

Trang 4

0x1054 0x1055 0x1056 0x1057

00111011

Trang 5

 Toán tử & để lấy địa chỉ của biến

 Toán tử * để lấy nội dung của biến được trỏ.

 Ví dụ:

int i=17;

int* ptr; // khai báo biến trỏ kiểu int

ptr= &i; // gán địa chỉ của biến i cho con trỏ ptr

Trang 6

Biến con trỏ …

17 0x1054

Trang 7

Biến con trỏ …

int v; // khai báo biến v kiểu int

int w; // khai báo biến w kiểu int

int* p; // khai báo biến p kiểu con trỏ trỏ tới kiểu int

p=&v; // gán địa chỉ của v cho con trỏ p

v=3; // gán giá trị 3 cho v

*p=7; // gán giá trị 7 cho v

p=&w; // gán địa chỉ của w cho con trỏ p

*p=12; // gán giá trị 12 cho w

gọi là tham chiếu ngược tới con trỏ.

Trang 8

Con trỏ hằng

 Khai báo hằng:

const int result = 5; // result là hằng result = 10; // sau đó gán lại giá trị thì C++ sẽ báo lỗi

 Khai báo con trỏ hằng:

const char* answer_ptr = "Forty-Two";

// answer_ptr là con trỏ trỏ tới hằng kiểu char

 Dữ liệu được trỏ bởi con trỏ hằng thì không thể thay đổi nhưng con trỏ thì có thể.

answer_ptr = "Fifty-One"; // đúng (answer_ptr là biến con trỏ)

*answer_ptr = 'X'; // sai (*answer_ptr là hằng)

Trang 9

Con trỏ hằng …

 Nếu khai báo:

char *const nameptr = "Test"; //name_ptr là con trỏ hằngnameptr = "New"; // sai (name_ptr là hằng)

*nameptr = 'B'; // đúng (*nameptr là char)

 Nếu khai báo như sau thì không thể thay đổi được cả con trỏ và nội dung của con trỏ:

const char* const titleptr = "Title";

Trang 10

Con trỏ là tham số của hàm

 C++ cung cấp 3 cách truyền tham số:

 Truyền tham trị: void f(int x);

 Truyền tham chiếu: void f(int& x);

 Truyền con trỏ: void f(int* x);

Trang 11

Con trỏ là tham số của hàm …

void swap( double& x, double& y)

swap(a,b); // gọi tham chiếu của biến a và b

swap(&a, &b); // sử dụng địa chỉ của biến a và b

Trang 12

Con trỏ là tham số của hàm…

void bsort (double* ptr, int n)

Trang 13

cout << ”Enter dd/mm/yyyy :”;

cin >> day >> dummy >> month >> dummy >> year;

Date* tmpptr = new Date date(day, month, year);

return tmpptr;

}

Date* ptr;

ptr=CreateDate();

Trang 14

char* str =”This is an old C-style string”;

int len=strlen(str); // xác định kích thước của str

char* ptr;

ptr = new char[len+1]; // cấp phát vùng nhớ

strcpy(ptr,str);

cout << ”ptr=” << ptr << endl;

Trang 15

Toán tử new được sử dụng trong hàm tạo

Trang 16

Con trỏ trỏ tới đối tượng

 Con trỏ trỏ tới các đối tượng cũng tương tự như các kiểu built-in khác.

 Truy nhập tới các thành phần thông qua toán

Trang 17

Ví dụ: Linked List

struct link // định nghĩa một phần tử trong danh sách

{

int data; // data item

link* next; // con trỏ trỏ tới phần tử kế tiếp

linklist() { first = NULL;} // hàm tạo không có tham số

void additem(int d); // bổ sung thêm một phần tử vào danh sách void display(); // hiển thị danh sách

} ;

Trang 18

newlink->next=first; // trỏ vào phần tử đầu tiên

first = newlink; // thay đổi con trỏ first

}

void linklist::display()

{

link* current=first; // bắt đầu từ phần tử đầu tiên

while(current != NULL) // đến khi kết thúc danh sách

{

cout << current->data << ” ”;

current=current->next; // di chuyển đến phần tử kế tiếp

Trang 19

Cấu trúc tự trỏ

 Một lớp có thể chứa con trỏ trỏ tới đối tượng của chính lớp đó, nhưng không thể chứa đối tượng của lớp đó.

Trang 21

cout<<p->data<<endl;

Trang 22

2 Tham chiếu

 Tham chiếu là một bí danh (alias)

 Khi ta tạo ra một tham chiếu, khởi tạo nó

bằng tên của một đối tượng khác (đối tượng đích)thì tham chiếu đóng vai trò là một cái

tên khác của đích.

 Bất kỳ việc gì được thực hiện trên tham chiếu cũng tức là được thực hiện trên đích.

 Khai báo tham chiếu:

int& rSomeRef = someInt;

Trang 23

int& rSomeRef = intOne;

cout << "&intOne: " << &intOne << endl;

cout << "&rSomeRef: " << &rSomeRef << endl;

Trang 24

Tham chiếu tới đối tượng

 Bất kỳ đối tượng nào cũng được tham chiếu, kể cả các đối tượng do người sử dụng định nghĩa

 Tham chiếu tới các đối tượng thường được sử dụng như chính đối

int& rIntRef = howBig;

 Tương tự, không thể khởi tạo một tham chiếu tới lớp CAT:

CAT& rCatRef = CAT; // sai

Phải khởi tạo rCatRef tới một đối tượng CAT cụ thể

CAT frisky;

Trang 25

Con trỏ Null và tham chiếu Null

 Khi con trỏ không được khởi tạo hoặc bị xoá thì chúng đều được gán bằng Null

 Tuy nhiên, một tham chiếu không thể là Null

 Một chương trình có tham chiếu tới một đối tượng Null thì bị coi là chương trình không hợp lệ và không thể kiểm soát được hết tất

cả các lỗi trong chương trình.

Trang 26

3 Sử dụng tham chiếu hay

con trỏ

hiện nhiệm vụ che dấu thông tin tốt hơn.

đối tượng và sau đó lại trỏ tới một đối tượng khác, thì ta phải sử dụng con trỏ

hợp đối tượng có thể là null thì ta phải sử dụng con trỏ.

int* pInt = new int;

Trang 27

Sử dụng tham chiếu hay con trỏ …

 Ta có thể khai báo cả con trỏ và tham chiếu trong cùng một danh sách các tham số của hàm, cùng với các đối tượng truyền trị khác

 Ví dụ:

CAT * SomeFunction (Person& theOwner, House* theHouse, int age);

 SomeFunction có 3 tham số:

 Tham số thứ nhất là tham chiếu tới đối tượng Person

 Tham số thứ hai là con trỏ tới đối tượng House

 Tham số thứ ba là một số nguyên

 Hàm trả về một con trỏ trỏ tới đối tượng CAT

 Trước khi truyền tham chiếu cho hàm hoặc trả về một tham chiếu thì ta phải đặt ra câu hỏi “Tham chiếu sẽ là bí danh của đối tượng nào và nó có tồn tại mỗi khi tham chiếu được sử

dụng không?”

Ngày đăng: 29/04/2021, 01:39

🧩 Sản phẩm bạn có thể quan tâm

w