Fa male riferirsi agli elementi dell'array di accesso tramite aritmetica del puntatore invece dell'operatore []?

12

Ho appena iniziato a imparare a programmare in C ea migliorare la mia comprensione dei puntatori e degli array, ho cercato di riferirmi agli elementi di un array senza creare alcun puntatore:

for(k1 = 0; k1 < ROW; k1++){
    for(k2 = 0; k2 < COLUMN; k2++){

        array[k1][k2] = k1*COLUMN + k2 + 1;

        printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));

    }
}

L'intero codice viene compilato e eseguito in modo impeccabile.

Immagino che dover creare un puntatore per ogni singolo array in un grande codice sorgente sembra essere altamente inefficiente.

Quindi, piuttosto che avere l'indirizzo di un array memorizzato e recuperato usando un puntatore, è una cattiva pratica di programmazione usare direttamente l'indirizzo dell'array, come mostrato sopra?

    
posta Niko Gambt 22.12.2015 - 15:59
fonte

3 risposte

15

È "cattivo" solo nella misura in cui è meno leggibile. a[x] è la stessa cosa di *(a+x) , quindi non c'è differenza di efficienza o comportamento (infatti, anche x[a] funzionerà). È solo che a[x] di solito è molto più intuitivo per noi umani.

Ma ciò non vuol dire che la leggibilità non sia un grosso problema. Per vedere quanto è grande, pensa a come "leggere" queste due espressioni se le vedi nel codice:

  • *(a+x) ="La cosa puntata dalla somma del puntatore a e intero x "
  • a[x] =" x th membro di array a "

Allo stesso modo, quando è necessario fare riferimento all'indirizzo di un elemento dell'array:

  • (a+x) ="La somma del puntatore a e intero x "
  • &a[x] ="L'indirizzo del x th membro di array a "

La maggior parte delle volte, le versioni [] sono più semplici da capire quando si guarda codice non banale che funziona su diversi array (in particolare array di matrici). Ecco perché l'operatore [] esiste in primo luogo.

P.S. Fare questo genere di cose rigorosamente come un esercizio di apprendimento è un'ottima idea. È importante capire che gli array in realtà sono solo indicatori e offset.

    
risposta data 22.12.2015 - 16:30
fonte
4

Sì, è una cattiva pratica, ma non per ragioni di inefficienza.

L'operatore della matrice usa il puntatore aritmetico sotto il cofano, quindi sono ugualmente efficienti.

Il problema con il puntatore aritmetico è che è molto soggetto a errori e difficile da leggere.

Regola empirica: non utilizzare il puntatore aritmetico a meno che non sia necessario.

    
risposta data 22.12.2015 - 16:07
fonte
0

Raffreddare il tuo apprendimento c, hai appena scoperto uno dei piccoli scioglilingua. Non stai facendo l'aritmetica del puntatore su un array, ma una serie di puntatori. Non è possibile eseguire aritmetica puntatore su array. Un array decade in un puntatore ma non è un puntatore che lo scrive da solo. Quello che hai (vedi commento di cmaster) è

int *array[]; //This is a array to pointers of type *int. 

array[k1] + k2; //This is pointer arithmetic on one pointer stored in the array  

Il dereferenziamento di questo puntatore dà il valore al puntatore appena calcolato, punta a. In generale, non c'è motivo di fare ciò che stai facendo. Ma puoi linearizzare la matrice e poi una falcata, come questa.

int array[y_dim*x_dim]; 
int index = x_dim*y + x; 
array[index]; //Gives you the element in x, y!

La sua altezza è x_dim. Spero che la mia risposta sia chiarire!

    
risposta data 22.01.2016 - 17:39
fonte

Leggi altre domande sui tag