Può darsi che si conosca un linguaggio orientato agli oggetti come Java o Python e ora si sta imparando il linguaggio C. La differenza tra Java e C quando si pensa a char board[3][3]
è che in C la variabile board
è rappresentata in memoria come 9 caratteri negli indirizzi di memoria adiacenti. In questo modo:
board: 1 2 3 4 5 6 7 8 9
In C, &board
produce lo stesso indirizzo di memoria di &board[0]
e &board[0][0]
.
In contrasto con questo, in Java variabile sarebbe stata dichiarata come char[][] board
e la sua rappresentazione della memoria sarebbe concettualmente simile a questa:
board: ptr(A) ptr(B) ptr(C)
A: 1 2 3
B: 4 5 6
C: 7 8 9
dove ptr(x)
punti a indirizzo di memoria di x
. Quindi, in Java, board
indica un indirizzo di memoria diverso da board[0]
.
si dice in C, & bordo produce lo stesso indirizzo di memoria di & bordo [0] e & bordo [0] [0]. Ma sono in grado di accedere al primo elemento solo tramite la board [0] [0] (o) * board [0] (o) ** board. Perché è così??
Anche se le espressioni &board
e &board[0]
e &board[0][0]
producono lo stesso indirizzo, il sistema di tipi del linguaggio C impedisce di accedere al valore char
. In un compilatore C, i tipi sono (concettualmente):
board: type char[3][3]
board[0]: type char[3]
board[0][0]: type char
Assumendo una variabile di tipo char
, possiamo scrivere:
char c;
c = board[0][0];
ma non può scrivere:
char c;
c = board; // Error
c = board[0]; // Error
perché la digitare sul lato sinistro è incompatibile con il tipo sul lato destro del compito.
Se si è certi che un indirizzo punta a un char
, è possibile utilizzare un tipo di getto:
char c;
c = *(char*)board; // Works OK
c = *(char*)board[0]; // Works OK
Lo svantaggio è che tale tipo calchi possono portare a errori di codifica.
Ciao grazie per la tua risposta e in parte capisco. Puoi fornire un semplice programma di esempio che spiega il tuo commento. Sarei di grande aiuto. Grazie. – intex0075
@intex la tua domanda * è * il semplice programma di esempio che vorrei fornire. –