Quando devo copiare un puntatore all'interno di una funzione?

2

Sto cercando di insegnare a me stesso la programmazione e apprezzerei molto l'aiuto con questo problema. Ho appena letto un tutorial sui puntatori ma ho un problema con l'esempio. La funzione copia una stringa in un'altra. Nella funzione originale è stata eseguita una copia con ptr. Qual'è il significato di questo? perché per quanto posso vedere non è necessario. C'è qualcosa di sbagliato nella mia funzione modificata o mi manca qualcosa?

// Esempio di tutorial

char *my_strcpy(char *destination, const char *source){
    char *ptr = destination;
    while(*source != '
void my_strcpy2(char *destination, const char *source){

    while(*source != '
char *my_strcpy(char *destination, const char *source){
    char *ptr = destination;
    while(*source != '
void my_strcpy2(char *destination, const char *source){

    while(*source != '%pre%'){
        *destination++ = *source++;
    }
    *destination = '%pre%';
}
'){ *ptr++ = *source++; } *ptr = '%pre%'; return destination; }
'){ *destination++ = *source++; } *destination = '%pre%'; }
'){ *ptr++ = *source++; } *ptr = '%pre%'; return destination; }

La mia revisione

%pre%

Grazie.

    
posta Gerry Martin 06.10.2013 - 02:27
fonte

2 risposte

5

Da un punto di vista tecnico, l'utilizzo di una variabile aggiuntiva ptr per rendere possibile il ritorno del valore destination originale non è necessaria, poiché ovviamente il chiamante deve avere già il valore di destination nel suo ambito. Se si progetta una funzione strcpy -like senza restituire quel valore, è possibile creare un'implementazione più completa, come mostrato sopra. Ma la funzione strcpy originale della libreria standard è definita per restituire destination , e my_strcpy tenta in modo ovvio di simulare tale comportamento / firma.

La ragione di questo è principalmente "zucchero sintattico", che consente l'uso di strcpy in una catena di chiamate. Leggi questo post SO per ottenere una spiegazione migliore di ciò che è buono.

    
risposta data 06.10.2013 - 09:04
fonte
0

Per capire meglio i puntatori, trovo utile mettere l'asterisco vicino al tipo, come char* destination . In questo modo si vede che il valore che si passa ha tipo "pointer to char" e si pensa semplicemente come un numero intero (di solito a 32 o 64 bit) che di per sé può essere modificato senza alcuna conseguenza. Probabilmente la tua comprensione è già buona, perché questo è il motivo per cui una copia locale non è necessaria. Il caso in cui con strcpy è utile è restituire il valore originale come indicato dall'altra risposta.

    
risposta data 06.10.2013 - 13:38
fonte

Leggi altre domande sui tag