Có thể là trường hợp bạn biết một ngôn ngữ hướng đối tượng như Java hoặc Python, và bây giờ bạn đang học ngôn ngữ C. Sự khác biệt giữa Java và C khi suy nghĩ về char board[3][3]
là trong C, biến số board
được biểu diễn trong bộ nhớ dưới dạng 9 ký tự tại các địa chỉ bộ nhớ lân cận. Cũng giống như vậy:
board: 1 2 3 4 5 6 7 8 9
Trong C, &board
mang lại địa chỉ bộ nhớ giống như &board[0]
và &board[0][0]
.
Ngược lại này, trong Java biến sẽ được khai báo là char[][] board
và đại diện bộ nhớ của nó khái niệm sẽ trông như thế này:
board: ptr(A) ptr(B) ptr(C)
A: 1 2 3
B: 4 5 6
C: 7 8 9
nơi ptr(x)
điểm đến địa chỉ bộ nhớ của x
. Vì vậy, trong Java, board
trỏ đến một địa chỉ bộ nhớ khác với board[0]
.
Bạn nói Trong C, & bảng mang lại địa chỉ bộ nhớ giống như [0] & đồng quản trị và Ban & [0] [0]. Nhưng tôi có thể truy cập phần tử đầu tiên chỉ qua bảng [0] [0] (hoặc) * bảng [0] (hoặc) **. Tại sao nó như vậy??
Mặc dù các biểu thức &board
và &board[0]
và &board[0][0]
mang lại cùng một địa chỉ, các hệ thống kiểu của ngôn ngữ C đang ngăn bạn truy cập các giá trị char
. Trong một trình biên dịch C, các loại là (theo lý thuyết):
board: type char[3][3]
board[0]: type char[3]
board[0][0]: type char
Giả sử một biến kiểu char
, chúng ta có thể viết:
char c;
c = board[0][0];
nhưng không thể viết:
char c;
c = board; // Error
c = board[0]; // Error
vì loại ở phía bên trái không tương thích với loại ở bên phải của nhiệm vụ.
Nếu bạn chắc chắn rằng một điểm địa chỉ để một char
, bạn có thể sử dụng một loại diễn viên:
char c;
c = *(char*)board; // Works OK
c = *(char*)board[0]; // Works OK
Nhược điểm là phôi kiểu như vậy có thể dẫn đến lỗi mã hóa.
Xin cảm ơn sự trả lời của bạn và tôi đã hiểu một phần. Bạn có thể cung cấp một chương trình mẫu đơn giản giải thích nhận xét của bạn không. Tôi sẽ giúp đỡ rất nhiều. Cảm ơn bạn. – intex0075
@intex câu hỏi của bạn * là * chương trình ví dụ đơn giản mà tôi sẽ cung cấp. –