Funzioni che restituiscono puntatori

3

C ++ noob qui. Ho una domanda molto basilare su un costrutto che ho trovato nel libro C ++ che sto leggendo.

// class declaration
class CStr {
  char sData[256];
 public:
  char* get(void);
};

// implementation of the function
char* CStr::get(void) {
  return sData;
}

Quindi la funzione Cstr::get è ovviamente pensata per restituire un puntatore di caratteri, ma la funzione sta passando a ciò che assomiglia al valore ( return sData ). C ++ sa per restituire l'indirizzo dell'oggetto restituito? La mia ipotesi sarebbe stata che la definizione della funzione sarebbe return &sData .

    
posta tchakravarty 09.10.2012 - 05:45
fonte

3 risposte

10

Per C e C ++, gli array degradano ai puntatori. Non è possibile restituire un array come valore di una funzione, è possibile restituire solo un puntatore. Restituire l'array equivale a restituire l'indirizzo del primo elemento dell'array:

return &sData[0];
    
risposta data 09.10.2012 - 06:22
fonte
2

Does C++ know to return the address of the returned object?

In questo caso, sì. Il nome di un array è un puntatore costante al primo elemento dell'array . Quindi, quando

char* CStr::get(void) {
    return sData;
}

viene eseguito, viene restituito il puntatore al primo elemento dell'array. Quindi, il chiamante può fare riferimento alla matrice e fare un attraversamento. Esegui il seguente codice. Vedrai l'output "ciao, mondo".

#include <iostream>
#include <string>

class CStr {
    char sData[256];
public:
    CStr(std::string str);
    char* get(void);
};

CStr::CStr(std::string str) {
    if (str.length() >= 256) {
        sData[0] = '\n';
        return;
    }

    str.append("\n");
    str.copy(sData, str.length());
}

char* CStr::get(void) {
    return sData;
}

int main() {
    CStr msg("hello, world");
    char* str = msg.get();

    while (*str != '\n')
        std::cout << *str++;

    return 0;
}
    
risposta data 09.10.2012 - 07:16
fonte
-1

In C e C ++ restituire il nome di un array è uguale a restituire l'indirizzo del primo elemento in un array, quindi è possibile restituire lo stesso indirizzo in tre modi diversi:

  1. return sData;
  2. return &sData;
  3. return &sData[0];

tutte e tre le istruzioni restituiscono lo stesso indirizzo.

    
risposta data 27.12.2012 - 10:19
fonte

Leggi altre domande sui tag