Trong hướng dẫn này, chúng ta sẽ tìm hiểu về con trỏ void và cách sử dụng chúng với sự trợ giúp của các ví dụ.
Trước khi bạn tiếp tục hướng dẫn này, hãy nhớ kiểm tra các con trỏ C ++.
Trong C ++, chúng ta không thể gán địa chỉ của một biến của một kiểu dữ liệu cho một con trỏ của kiểu dữ liệu khác. Hãy xem xét ví dụ này:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Ở đây, lỗi xảy ra vì địa chỉ là một double
biến kiểu. Tuy nhiên, con trỏ thuộc int
loại.
Trong những tình huống như vậy, chúng ta có thể sử dụng con trỏ để hủy (void pointers) trong C ++. Ví dụ,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Con trỏ void là một con trỏ chung được sử dụng khi chúng ta không biết kiểu dữ liệu của biến mà con trỏ trỏ đến.
Ví dụ 1: Con trỏ Void trong C ++
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Đầu ra
0xffd117ac 0xffd117ac
Ở đây, con trỏ ptr
được cung cấp giá trị &f
.
Kết quả cho thấy rằng con trỏ void ptr lưu trữ địa chỉ của một float
biến f.
Vì void
là một kiểu trống, con trỏ void không thể được tham chiếu.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Ví dụ 2: In nội dung của con trỏ Void
Để in nội dung của một con trỏ void, chúng ta sử dụng static_cast
toán tử. Nó chuyển đổi con trỏ từ void*
kiểu thành kiểu dữ liệu tương ứng của địa chỉ mà con trỏ đang lưu trữ:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Đầu ra
Nội dung của con trỏ là 2.3
Chương trình này in ra giá trị của địa chỉ được trỏ tới bởi void
con trỏ ptr.
Vì chúng ta không thể bỏ qua một void
con trỏ, chúng ta không thể sử dụng *ptr
.
Tuy nhiên, nếu chúng ta chuyển đổi void*
kiểu con trỏ thành float*
kiểu, chúng ta có thể sử dụng giá trị mà void
con trỏ trỏ tới.
Trong ví dụ này, chúng tôi đã sử dụng static_cast
toán tử để chuyển đổi kiểu dữ liệu của con trỏ từ void*
sang float*
.
Đúc kiểu C
Chúng ta cũng có thể sử dụng ép kiểu C để in giá trị.
// valid cout << *((float*)ptr);
Tuy nhiên, static_cast
được ưu tiên để đúc kiểu C.
Lưu ý: con trỏ void không thể được sử dụng để lưu trữ địa chỉ của các biến có const
hoặc định tính volatile
.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;