Cho các khai báo sau:
void *tongquat;
int *nguyen;
char *kitu;
Phép gán nào là không hợp lệ:
Trả lời:
Đáp án đúng: B
Trong C/C++, kiểu void * là một kiểu con trỏ đặc biệt, có thể trỏ tới bất kỳ kiểu dữ liệu nào. Tuy nhiên, khi sử dụng con trỏ void *, cần phải ép kiểu tường minh khi gán giá trị cho một con trỏ kiểu khác hoặc khi truy xuất giá trị mà nó trỏ tới.
Phân tích các lựa chọn:
- A.
tongquat = nguyen;: Gán một con trỏ kiểuint *cho một con trỏ kiểuvoid *là hợp lệ vìvoid *có thể trỏ đến bất kỳ kiểu dữ liệu nào. - B.
*nguyen = *tongquat;: Đây là phép gán không hợp lệ.tongquatlà con trỏ kiểuvoid *, do đó không thể trực tiếp truy xuất giá trị mà nó trỏ tới (*tongquat) mà không ép kiểu. Hơn nữa, ngay cả khi ép kiểu, ta cũng không biết kiểu dữ liệu màtongquattrỏ tới là gì để có thể gán giá trị cho*nguyenmột cách an toàn. - C.
kitu = (char*)tongquat;: Phép gán này gần đúng, nên ép kiểu tường minh từvoid*sangchar*trước khi gán. Trong đề,kitu = (char)tongquat;là sai vì ép kiểu về 1 ký tự rồi gán cho con trỏ ký tự. - D.
tongquat = kitu;: Tương tự như A, việc gán một con trỏ kiểuchar *cho một con trỏ kiểuvoid *là hợp lệ.
Vậy, phép gán không hợp lệ là B và C, tuy nhiên, vì đây là câu hỏi trắc nghiệm chọn MỘT đáp án, ta cần đánh giá xem đáp án nào sai hơn. Trong trường hợp này, B sai nghiêm trọng hơn vì truy xuất giá trị từ con trỏ void mà không ép kiểu là một lỗi lập trình nghiêm trọng, trong khi C sai do ép kiểu không đúng cách (ép kiểu thành `char` thay vì `char*`).





