Cho khai báo:struct T {int x; float y;} t, *p, a[10]Câu lệnh nào không hợp lệ:
Đáp án đúng: D
Phân tích câu hỏi:
Câu hỏi kiểm tra kiến thức về con trỏ và struct trong C/C++. Cần xác định cách sử dụng con trỏ để trỏ đến các thành phần của struct và mảng struct.
Đánh giá các phương án:
- A. p=&t;
t
là một biến kiểustruct T
,&t
là địa chỉ của biếnt
.p
là một con trỏ kiểustruct T*
. Câu lệnh này gán địa chỉ củat
chop
, hoàn toàn hợp lệ. - B. p=&t.x;
t.x
là một thành viên (kiểuint
) của structt
,&t.x
là địa chỉ của thành viênx
. Tuy nhiên,p
là một con trỏ kiểustruct T*
, không phảiint*
. Do đó, câu lệnh này không hợp lệ vì kiểu dữ liệu không khớp. - C. p=&a[5];
a
là một mảng gồm 10 phần tử, mỗi phần tử có kiểustruct T
.a[5]
là phần tử thứ 6 của mảng (chỉ số bắt đầu từ 0), và nó có kiểustruct T
.&a[5]
là địa chỉ của phần tử thứ 6, và nó có kiểustruct T*
, phù hợp với kiểu củap
. Câu lệnh này hợp lệ. - D. p=&a;
a
là tên mảng, khi dùng trong biểu thức (ngoại trừ các trường hợp đặc biệt như toán tửsizeof
), nó thường được chuyển đổi thành con trỏ đến phần tử đầu tiên của mảng. Tuy nhiên,&a
sẽ lấy địa chỉ của toàn bộ mảnga
. Về mặt giá trị, địa chỉ này có thể giống với địa chỉ củaa[0]
, nhưng về mặt kiểu, nó là một con trỏ đến mảng 10 phần tử kiểustruct T
, tức làstruct T (*)[10]
, chứ không phảistruct T*
. Vì vậy, câu lệnh này không hợp lệ.
Kết luận:
Câu lệnh B không hợp lệ vì cố gắng gán địa chỉ của một biến kiểu int (t.x) cho một con trỏ kiểu struct T*.
Câu lệnh D không hợp lệ vì cố gắng gán địa chỉ của mảng (struct T (*)[10]) cho con trỏ struct T*.
Trong 2 câu B và D thì câu B sai tường minh hơn vì kiểu dữ liệu của vế phải không phù hợp với vế trái, do đó câu B được coi là đáp án đúng nhất.