aggiungendo il puntatore dell'array in c

4

Ho problemi a capire come funziona questa equazione in c:

char *sum(char *a, int b) {
    return &a[b];
}

printf("%d", sum(5, 4));

Capisco come funzionano gli array e capisco come fare riferimento e de-referenziare una variabile in una posizione di memoria, ma non capisco da dove arriva l'aggiunta per giocare qui.

Per me è logico che return &a[4] , ad esempio, restituisca solo un percorso di memoria inesistente e de-referenziato e causi un errore.

Qualcuno può spiegarmi questo con una terminologia semplice?

    
posta Jonathan 28.11.2013 - 00:41
fonte

3 risposte

3

In C, l'operazione di indice della matrice a[b] viene implicitamente trattata dal compilatore come *(a + b) .

Questa proprietà significa che è possibile scrivere, ad esempio:

assert(5["A string"] == 'i');

Ed è vero.

Poiché C esegue anche conversioni implicite da int a un tipo di puntatore, il tuo esempio viene valutato in questo modo:

sum(5,4) -> char *a = 5, b = 4
return &a[b]; -> return &(*(a + b)); -> return &(*((char*)5 + 4));

Perché non c'è accesso alla memoria, (il valore di a [b] non è ispezionato o assegnato) il & e * gli operatori sono cancellati e la somma interna ( 5+4 ) viene castata a char* restituita come-è.

La particolare posizione di a in memoria è irrilevante e il valore in a è irrilevante perché non viene eseguito l'accesso alla memoria.

    
risposta data 28.11.2013 - 02:53
fonte
2

Restituisce l'indirizzo di b unità di carattere in memoria dal puntatore ad a.

Poiché restituirà un indirizzo in memoria, puoi trovare qualsiasi cosa in quell'indirizzo, un NULL o qualsiasi altro carattere.

Quindi se hai somma (5,4), il primo parametro sarà preso come indirizzo (il punto di partenza) e restituirà 4 unità in memoria da 5.

  • Se la macchina definisce un carattere come 1 byte, restituirà 9.
  • Se la macchina definisce un carattere come 2 byte, restituirà 5 + 2 + 2 + 2 + 2 = 13.
  • E così via.
risposta data 28.11.2013 - 01:04
fonte
1

Sei quasi arrivato. &a[4] restituisce un + 4 volte sizeof (tipo di elementi in a) (in questo caso char). Questo viene quindi restituito, nel tuo caso come 5 + 4 = 9.

Il valore è valido, ma la deferenza alla memoria non valida si verifica solo se la si utilizza per accedere alla memoria, quindi a questo punto non è successo nulla di "cattivo".

char *a = sum(5,4) 
printf ("%d",a);       is OK and prints 9 
printf ("%d", *a);     all bets off..... 

un altro esempio su cui riflettere: char * x = NULL; x è NULL, ma non ottieni un'eccezione di puntatore Null generata finché non fai qualcosa con esso come *x = y ;

Ti suggerisco anche di compilare questo codice con -Wall e studiare gli avvertimenti.

    
risposta data 28.11.2013 - 01:00
fonte

Leggi altre domande sui tag