What will be the output of the C program?

4 phương ánCó giải thích
Đề bài
int arr[5] = { 2, 3, 5, 4, 7 };
int *ptr = (&arr + 1);
printf("%d %d\n", *(arr + 1), *(ptr - 1));

Các phương án trả lời

Chọn một phương án
Lời giảiChọn phương án để mở
Đáp án đúng: "3 7". Tên mảng arr khi dùng trong biểu thức suy biến thành con trỏ tới phần tử đầu, nên *(arr + 1) chính là arr[1], bằng 3. Nhưng &arr lại mang kiểu con trỏ tới cả mảng năm int, nên &arr + 1 nhảy qua trọn mảng và trỏ vào ô ngay sau arr[4]; gán vào int *ptr rồi ptr - 1 lùi đúng một ô int nên về arr[4], bằng 7. Chương trình in 3 7. Cần công bố khuyết điểm: bản khoá in kèm ghi 3 2, giá trị đó chỉ ra được nếu hiểu &arr + 1 nhảy một phần tử như arr + 1, khi đó ptr - 1 mới về arr[0], nên "3 2" sai. "2 3" lấy arr[0] cho vế đầu, nhưng vế đầu là arr[1]. "2 6356728" giả định đọc phải rác ngoài mảng, trong khi ptr - 1 vẫn trỏ vào đúng phần tử cuối của arr.

Cùng phần 5

Xuất hiện trong 1 bộ đề