Trả lời:
Đáp án đúng: A
Đoạn code thực hiện các thao tác trên mảng. Ta sẽ xét từng bước:
1. `int arr[] = {1, 2, 3, 4, 5};` Khởi tạo mảng arr với các giá trị 1, 2, 3, 4, 5.
2. `int *p = arr;` Khởi tạo con trỏ p trỏ đến phần tử đầu tiên của mảng arr (arr[0] tức là 1).
3. `int *q = arr + 3;` Khởi tạo con trỏ q trỏ đến phần tử thứ 4 của mảng arr (arr[3] tức là 4).
4. `*p++;` Tăng giá trị của phần tử mà p đang trỏ tới lên 1, tức là arr[0] bây giờ là 2. Sau đó, p trỏ đến phần tử tiếp theo của mảng (arr[1]).
5. `*p++ = *q-- + 1;`
* `*q-- + 1;` Giá trị của phần tử mà q đang trỏ tới (arr[3] = 4) được lấy, cộng thêm 1 thành 5. Sau đó, q trỏ đến phần tử phía trước (arr[2]).
* `*p++ = 5;` Giá trị 5 được gán cho phần tử mà p đang trỏ tới (arr[1]). Sau đó, p trỏ đến phần tử tiếp theo (arr[2]). Vậy, arr[1] bây giờ là 5.
6. `*q += 2;` Giá trị của phần tử mà q đang trỏ tới (arr[2] = 3) được cộng thêm 2. Vậy, arr[2] bây giờ là 5.
7. `printf("%d %d %d %d", arr[0], arr[1], arr[2], arr[3]);` In ra các giá trị arr[0], arr[1], arr[2], arr[3]. Giá trị của chúng lần lượt là 2, 5, 5, 4.
Tuy nhiên, không có đáp án nào trùng khớp với kết quả 2 5 5 4. Có vẻ như có một lỗi đánh máy trong câu hỏi hoặc các lựa chọn đáp án. Nếu như dòng `*p++ = *q-- + 1;` mà là `*p++ = *q++ + 1;` thì kết quả sẽ là `4 3 0 0`.
Nếu dòng đó là `*p++ = *q++ + 1;` thì giải thích sẽ là:
1. `int arr[] = {1, 2, 3, 4, 5};` Khởi tạo mảng arr với các giá trị 1, 2, 3, 4, 5.
2. `int *p = arr;` Khởi tạo con trỏ p trỏ đến phần tử đầu tiên của mảng arr (arr[0] tức là 1).
3. `int *q = arr + 3;` Khởi tạo con trỏ q trỏ đến phần tử thứ 4 của mảng arr (arr[3] tức là 4).
4. `*p++;` Tăng giá trị của phần tử mà p đang trỏ tới lên 1, tức là arr[0] bây giờ là 2. Sau đó, p trỏ đến phần tử tiếp theo của mảng (arr[1]).
5. `*p++ = *q++ + 1;`
* `*q++ + 1;` Giá trị của phần tử mà q đang trỏ tới (arr[3] = 4) được lấy, cộng thêm 1 thành 5. Sau đó, q trỏ đến phần tử phía sau (arr[4]).
* `*p++ = 5;` Giá trị 5 được gán cho phần tử mà p đang trỏ tới (arr[1]). Sau đó, p trỏ đến phần tử tiếp theo (arr[2]). Vậy, arr[1] bây giờ là 5.
6. `*q += 2;` Giá trị của phần tử mà q đang trỏ tới (arr[4] = 5) được cộng thêm 2. Vậy, arr[4] bây giờ là 7.
7. `*--p;` Vì p đang trỏ vào arr[2] , nên --p sẽ làm p trỏ vào arr[1], và giá trị ở đó (arr[1] = 5) sẽ bị giải tham chiếu nhưng không được dùng để gán hay tăng gì cả, nên dòng lệnh này không ảnh hưởng đến output.
8. `printf("%d %d %d %d", arr[0], arr[1], arr[2], arr[3]);` In ra các giá trị arr[0], arr[1], arr[2], arr[3]. Giá trị của chúng lần lượt là 2, 5, 3, 4.
Trong trường hợp này, không có đáp án đúng.
Câu hỏi liên quan

FORM.08: Bộ 130+ Biểu Mẫu Thống Kê Trong Doanh Nghiệp

FORM.07: Bộ 125+ Biểu Mẫu Báo Cáo Trong Doanh Nghiệp

FORM.06: Bộ 320+ Biểu Mẫu Hành Chính Thông Dụng

FORM.05: Bộ 330+ Biểu Mẫu Thuế - Kê Khai Thuế Mới Nhất

FORM.04: Bộ 240+ Biểu Mẫu Chứng Từ Kế Toán Thông Dụng
