JavaScript is required

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

A.

p=&t;

B.

p=&t.x;

C.

p=&a[5]

D.
p=&a;
Trả lời:

Đá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ểu struct T, &t là địa chỉ của biến t. p là một con trỏ kiểu struct T*. Câu lệnh này gán địa chỉ của t cho p, hoàn toàn hợp lệ.

  • B. p=&t.x;

    t.x là một thành viên (kiểu int) của struct t, &t.x là địa chỉ của thành viên x. Tuy nhiên, p là một con trỏ kiểu struct T*, không phải int*. 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ểu struct T. a[5] là phần tử thứ 6 của mảng (chỉ số bắt đầu từ 0), và nó có kiểu struct T. &a[5] là địa chỉ của phần tử thứ 6, và nó có kiểu struct T*, phù hợp với kiểu của p. 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ảng a. Về mặt giá trị, địa chỉ này có thể giống với địa chỉ của a[0], nhưng về mặt kiểu, nó là một con trỏ đến mảng 10 phần tử kiểu struct T, tức là struct T (*)[10], chứ không phải struct 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.

Câu hỏi liên quan