Возможно, вы знаете объектно-ориентированный язык, такой как Java или Python, и теперь вы изучаете язык C. Разница между Java и C при мысли о char board[3][3]
заключается в том, что в C переменная board
представлена в памяти как 9 символов при смежных адресах памяти. Подобно:
board: 1 2 3 4 5 6 7 8 9
В C, &board
дает тот же адрес памяти как &board[0]
и &board[0][0]
.
В отличие от этого, в Java переменная будет объявлена как char[][] board
и его представление памяти будет концептуально выглядеть следующим образом:
board: ptr(A) ptr(B) ptr(C)
A: 1 2 3
B: 4 5 6
C: 7 8 9
где ptr(x)
указывает на адрес памяти x
. Итак, в Java board
указывает на другой адрес памяти, чем board[0]
.
Вы говорите, что в C, & плата дает тот же адрес памяти, как & платы [0] и & доски [0] [0]. Но я могу получить доступ к первому элементу только с помощью платы [0] [0] (или) * платы [0] (или) **. Почему это так??
Хотя выражения &board
и &board[0]
и &board[0][0]
дают один и тот же адрес, тип система языка C мешает вам доступ к значению char
. В C компилятор, типы (концептуально):
board: type char[3][3]
board[0]: type char[3]
board[0][0]: type char
Предполагая переменную типа char
, мы можем написать:
char c;
c = board[0][0];
, но не может написать:
char c;
c = board; // Error
c = board[0]; // Error
, поскольку тип на левой стороне несовместим с типом в правой части задания.
Если вы уверены, что адрес указывает на char
, вы можете использовать приведение типа:
char c;
c = *(char*)board; // Works OK
c = *(char*)board[0]; // Works OK
Недостатком является то, что такие броски типа может привести к кодирования ошибок.
Привет, спасибо за ваш ответ, и я частично понимаю. Можете ли вы предоставить простую примерную программу, объясняющую ваш комментарий. Я бы очень помог. Спасибо. – intex0075
@intex ваш вопрос * есть * простая примерная программа, которую я бы предоставил. –