JavaScript is required

Cho khai báo. Câu lệnh nào không hợp lệ? struct T { int x; float y; } t, * p, a[10]

A.

p=&t

B.

p=&t.x

C.

p=&a[5]

D.

p=&a

Trả lời:

Đáp án đúng: D


Trong khai báo struct T { int x; float y; } t, *p, a[10];

  • t là một biến kiểu struct T.
  • p là một con trỏ trỏ đến kiểu struct T.
  • a là một mảng 10 phần tử, mỗi phần tử có kiểu struct T.

Xét các phương án:

  • A. p = &t: Đúng. p là con trỏ kiểu struct T, &t là địa chỉ của biến t (kiểu struct T).
  • B. p = &t.x: Sai. &t.x là địa chỉ của thành viên x (kiểu int) trong struct t, do đó nó có kiểu int*, không phải struct T*. Không thể gán địa chỉ của một biến int cho một con trỏ kiểu struct T*.
  • C. p = &a[5]: Đúng. a[5] là một phần tử trong mảng a, có kiểu struct T, &a[5] là địa chỉ của phần tử đó.
  • D. p = &a: Sai. &a là địa chỉ của mảng a, có kiểu struct T (*)[10], không phải struct T*.

Vậy, câu lệnh không hợp lệ là B. p=&t.x và D. p=&a. Trong các đáp án đã cho, đáp án B là đáp án sai gần nhất vì nó có lỗi về kiểu dữ liệu rõ ràng. Đáp án D cũng sai, nhưng vì đề bài yêu cầu chọn một đáp án không hợp lệ, nên B hợp lý hơn vì nó sai về bản chất gán địa chỉ của kiểu int cho con trỏ kiểu struct. Tuy nhiên đề bài có vẻ không chặt chẽ lắm vì có đến hai đáp án không hợp lệ.

Câu hỏi liên quan