JavaScript is required

What will be output of following program? #include #include void main() { char ch[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; int *p = (int*)ch; p++; printf("%x", *p); getch(); }

A.

37363534

B.

34353637

C.

45673333

Trả lời:

Đáp án đúng: A


Chương trình C này sử dụng con trỏ và ép kiểu để truy cập và in ra các byte của một mảng ký tự. 1. **Khai báo và khởi tạo**: `char ch[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};` khai báo một mảng ký tự `ch` chứa các ký tự số từ '0' đến '9'. 2. **Ép kiểu và gán**: `int *p = (int*)ch;` Khai báo một con trỏ kiểu `int` là `p` và gán địa chỉ của mảng `ch` cho nó. Việc ép kiểu `(int*)` cho phép con trỏ `p` coi vùng nhớ của `ch` như một mảng các số nguyên. 3. **Tăng con trỏ**: `p++;` Tăng con trỏ `p` lên một vị trí. Vì `p` là một con trỏ kiểu `int`, nó sẽ tăng lên một khoảng bằng kích thước của một số nguyên (thường là 4 bytes). 4. **In giá trị**: `printf("%x", *p);` In giá trị mà con trỏ `p` trỏ tới dưới dạng số hex. Vì con trỏ `p` đã được tăng lên 1, nó sẽ trỏ đến 4 bytes tiếp theo trong mảng `ch`. Trên hầu hết các hệ thống, một số nguyên (int) chiếm 4 byte. Do đó, sau khi `p++`, `p` sẽ trỏ đến vị trí bắt đầu từ ký tự '4'. Giá trị của `*p` sẽ là một số nguyên được tạo thành từ 4 byte này. Thứ tự byte có thể khác nhau tùy thuộc vào kiến trúc (big-endian hoặc little-endian). Giả sử hệ thống là little-endian (byte nhỏ nhất ở địa chỉ thấp nhất), thì 4 byte từ vị trí '4' sẽ là '4', '5', '6', '7'. Khi được đọc như một số nguyên, nó sẽ được hiểu là `0x34353637` (trong hệ thập phân là 875770423), vì mã ASCII của '4' là 0x34, '5' là 0x35, '6' là 0x36, và '7' là 0x37. Vì vậy, kết quả in ra sẽ là `34353637`. Nếu hệ thống là big-endian, kết quả sẽ là 0x37363534. Trong các lựa chọn đưa ra, lựa chọn phù hợp nhất (dựa trên cách trình bày mã và giả định little-endian) là B.

Câu hỏi liên quan