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

8 6 con trỏ void lập trình C++ daynhauhoc.com

3 158 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 567,82 KB

Nội dung

Trang 1

3.6 Con trỏ void Thursday, September 21, 2017 7:47 PM Được cắt từ: https://cpp.daynhauhoc.com/8/6-con-tr-void/ Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++ Void pointers

Con trỏ kiểu void, có thể gọi là con trỏ tổng quát, là một kiểu dữ liệu đặc biệt của con trỏ Con trỏ kiểu void có thể trỏ đến bất kỳ đối tượng nào (với bất kỳ kiểu dữ liệu nào) có địa chỉ cụ thể trên bộ nhớ ảo Cách khai báo con trỏ kiểu void cũng giống với các con trỏ có kiểu dữ liệu được xây

dung san:

void *ptr; // ptr is a void pointer

Bây giờ, mình có thể gán địa chỉ của các biến có kiểu dữ liệu khác nhau cho con trỏ ptr: void *ptr; int 1Value; float fValue; double dValue; string str; int iArr[10]; ptr = &iValue; ptr = &fValue; ptr = &dValue; ptr = &str; ptr = iArr; Chúng ta còn có thể cho con trỏ void trỏ đến những con trỏ khác: void *ptr; int *iArr = new int[10]; ptr = iArr; delete[] iArr;

Cũng như mọi kiểu con trỏ khác, con trỏ kiểu void cũng có kích thước 4

bytes khi chạy trên nền tảng 32 bits, hoặc 8 bytes nếu chạy trên nên tàng

64 bits Tuy nhiên, con trỏ kiểu void không xác định được kiểu dữ liệu

của vùng nhớ mà nó trỏ tới, chúng ta không thể truy xuất trực tiếp nội dung thơng qua tốn tử dereference được Do đó, con trỏ kiểu void cần

phải được ép kiểu một cách rõ ràng sang con trỏ có kiểu dữ liệu khác

trước khi sử dụng toán tử dereference cho vùng nhớ mà con trỏ dang nam giữ

Trang 2

int value = 5;

void *vPtr = &value;

int *iPtr = static_cast<int *> (vPtr);

cout << *iPtr << endl;

Luc nay, vPtr va iPtr déu trd vao dia chi cua bién value, nhung chung ta

chi co thé str dung toan ttr dereference [én con tro iPtr cht? khéng thé str

dung cho con tro vPtr

Điều gì xảy ra nếu chúng ta ép sai kiểu dữ liệu?

Thử với ví dụ sau: int value = 5;

void *vPtr = &value;

int *iPtr = static_cast<int *> (vPtr);

cout << *iPtr << endl;

int64_t * i64Ptr = static_cast<int64_t *> (vPtr);

cout << *164Ptr << endl; Két qua:

5

-5233161171908952059

Như các bạn thấy, sử dụng sai kiểu dữ liệu đi kèm với đó là kết quả không mong muốn Do đó, chúng ta nên hạn chế sử dụng con trỏ kiểu void

Vậy chúng ta sử dụng con trỏ kiểu void cho mục đích gì?

Chúng ta thường sử dụng con trỏ kiểu void khi mà dữ liệu bên trong vùng nhớ đó không quan trọng Ví dụ mình muốn copy dữ liệu từ dẫy vùng nhớ này sang dãy vùng nhớ khác mà không cần quan tâm định dạng của chúng

Ví dụ:

void *ptr = operator new (190);

Dòng lệnh trên sử dụng toán tử new để cấp phát 100 bytes trên Heap partition và lưu địa chỉ của vùng nhớ đó bên trong con trỏ ptr

Con trỏ void cũng thường được sử dụng làm tham số của hàm khi muốn

input của hàm là con trỏ có kiểu dữ liệu bất kỳ Chúng ta sẽ tìm hiểu vấn

đề này trong những bài học tiếp theo

Việc giải phóng một vùng nhớ trên Heap bằng tên con trỏ kiểu void cũng có thể gây ra lỗi vì hệ điều hành không tính được kích thước vùng nhớ cần thu hồi là bao nhiêu

Ngày đăng: 25/10/2017, 20:36

TỪ KHÓA LIÊN QUAN