JavaScript is required

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ệ:

A.

tongquat = nguyen;

B.

*nguyen = *tongquat;

C.

kitu = (char)tongquat;

D.
tongquat = kitu;
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ểu int * cho một con trỏ kiểu void * 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ệ. tongquat là con trỏ kiểu void *, 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à tongquat trỏ tới là gì để có thể gán giá trị cho *nguyen mộ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* sang char* 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ểu char * cho một con trỏ kiểu void * 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*`).

Câu hỏi liên quan