Ir ao conteúdo

Posts recomendados

Postado
#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;



void MudouPara(char *novaCasa);

void MudouPara(char *novaCasa){

   char *novoEndereco = "Rua Piaui, 718";

   novaCasa = novoEndereco;

}



int main()

{

   char *enderecoAnitta;

   enderecoAnitta = "Rua da Mantiqueira";

   MudouPara(enderecoAnitta);

   cout << enderecoAnitta << endl;

   return 0;

}


No código acima, é preciso mudar o endereço de Annita através da função MudouPara usando ponteiro, fazendo assim a saída final ficar Rua Piaui, 718 ao invés de rua da Mantiqueira , porém mesmo eu rodando MudouPara(enderecoAnitta), a saída padrão continua rua da mantiqueira. Já fiz MudouPara(&enderecoAnitta) e não muda.
O objetivo é que MudouPara conseguisse mudar o enderecoAnnita sem usar return apenas usando ponteiro alterando a saída padrão para rua Piaui, 718 sem alterar nenhum código no Main. Alguém sabe como fazer isso funcionar?

Postado

 Fica fácil, para mim, quando aceito que todo ponteiro é também um objeto e existe uma referência para um objeto.

 

int main (void)
{   char   *endereco0_cstring= {"Rua da Mantiqueira"};
    char   *(*endereco1_cstring)= &endereco0_cstring;
    char   *(*(*endereco2_cstring))= &endereco1_cstring;

    printf ("Endereco: %s \n", (*(*endereco2_cstring)));
    return 0;
}

 

Postado

Olá

 

Meu palpite...


Se

você quer mudar um endereço e tem até uma função com esse nome 

Então

apenas retorne o endereço novo a partir do endereço antigo já que é aparentemente o que quer fazer: a partir de algum critério devolver um endereço novo. Não declare tal função como void e sim algo como

char * mudou_de(char* casa_antiga );

Note que em C++ em geral se pode usar a classe string ao invés de  char* 
 

Sobre esse trecho


void MudouPara(char *novaCasa);

void MudouPara(char *novaCasa){

   char *novoEndereco = "Rua Piaui, 718";

   novaCasa = novoEndereco;

}

Não há razão em declarar o protótipo se vai logo em seguida declarar a própria função. Talvez ache mais produtivo declarar sempre os protótipos todos e iniciar o código por main(). Conforme os programas crescem isso pode ficar mais importante.

 

Entenda que essa variável novoEndereco só existe entre esse bloco delimitado pelas chaves {}. E como sua função também não retorna nada esses valores vão sumir para sempre. Mesmo que você consiga o endereço seu programa vai cancelar assim que tentar acessar isso fora do trecho em que tal endereço é válido. Declarar o argumento como char** ou algo assim acrobático pode não fazer muita diferença: o problema aqui é que você tem que alocar memória para isso, além de devolver o endereço para quem chamou a função. 

 

Estou com tempo agora e vou mostrar 3 exemplos, espero que ajude a entender as diferenças. Se quiser fazer algo diferente desses escreva de novo...

 

Em um conservador programa C

 

Você poderia declarar uma função assim

char* mudou_de(char* casaAntiga)
{
    char* umEndereco = "Rua Piaui, 718";
    if (casaAntiga == NULL) return NULL;
    if (strcmp(casaAntiga, "Rua da Mantiqueira") == 0)
    {
        char * novoEndereco =  (char *) malloc( strlen(umEndereco) + 1 );
        strcpy(novoEndereco, umEndereco);
        return novoEndereco;
    }    // end if
    return casaAntiga;    // entao nao vai mudar
}    // end mudou_de()

e chamar assim

int main( int argc, char** argv)
{
    char* um_endereco        = "Rua do Forum";
    char* enderecoAnitta    = "Rua da Mantiqueira";

    printf("mudou_de(%s) retornou [%s]\n", um_endereco, mudou_de(um_endereco));
    printf("mudou_de(%s) retornou [%s]\n", enderecoAnitta, mudou_de(enderecoAnitta));

    return 0;

}

e ver isso na tela

mudou_de(Rua do Forum) retornou [Rua do Forum]
mudou_de(Rua da Mantiqueira) retornou [Rua Piaui, 718]

Funciona porque quando você chama mudou_de("algum endereco") e a função determina que vai mudar mesmo ela aloca memória para hospedar o novo endereço e devolve o endereço a quem chamou. E se não for para mudar ela devolve o endereço original e a vida continua

 

Em C++ usando char*

 

Você poderia declarar uma função assim

char* mudou_de(char* casaAntiga)
{
    char umEndereco[] = "Rua Piaui, 718";
    if (casaAntiga == NULL) return NULL;
    if (strcmp(casaAntiga, "Rua da Mantiqueira") == 0)
    {
        char* novoEndereco = new char(sizeof(umEndereco));
        strcpy(novoEndereco, umEndereco);
        return novoEndereco;
    }    // end if
    return casaAntiga;    // entao nao vai mudar
}    // end mudou_de()

Claro que é quase igual. Mas aqui você usa o operador new e sizeof(). Poderia chamar assim

int main(int argc, char** argv)
{
    char um_endereco[] =    "Rua do Forum";
    char enderecoAnitta[] = "Rua da Mantiqueira";

    char* e = mudou_de(um_endereco);
    cout << "Usando ponteiro: mudou_de(" << um_endereco << ") retornou '" << e << "'" << endl;
    cout << "Usando variavel: mudou_de(" << um_endereco << ") retornou '" << mudou_de(um_endereco) << "'" << endl;

    cout << endl;

    e = mudou_de(enderecoAnitta);
    cout << "Usando ponteiro: mudou_de(" << enderecoAnitta << ") retornou '" << e << "'" << endl;
    cout << "Usando variavel: mudou_de(" << enderecoAnitta << ") retornou '" << mudou_de(enderecoAnitta) << "'" << endl;

    return 0;
 }

e ver isso na tela

Usando ponteiro: mudou_de(Rua do Forum) retornou 'Rua do Forum'
Usando variavel: mudou_de(Rua do Forum) retornou 'Rua do Forum'

Usando ponteiro: mudou_de(Rua da Mantiqueira) retornou 'Rua Piaui, 718'
Usando variavel: mudou_de(Rua da Mantiqueira) retornou 'Rua Piaui, 718'

E funciona porque aloca a memória necessária -- quando for o caso --- usando new e devolve o endereço

 

Em C++ usando a classe string

 

Você poderia declarar uma função assim

string mudou_de(string casaAntiga)
{
    string umEndereco = "Rua Piaui, 718";
    if (casaAntiga.compare("Rua da Mantiqueira") == 0)
    {
        return umEndereco;
    }    // end if
    return casaAntiga;    // entao nao vai mudar
}    // end mudou_de()

E poderia chamar assim

int main(int argc, char** argv)
{
    string um_endereco =    "Rua do Forum";
    string enderecoAnitta = "Rua da Mantiqueira";

    cout << "mudou_de(" << um_endereco << ") retornou '" << mudou_de(um_endereco) << "'" << endl;
    cout << endl;
    cout << "mudou_de(" << enderecoAnitta << ") retornou '" << mudou_de(enderecoAnitta) << "'" << endl;

    return 0;
}

e ver isso na tela

mudou_de(Rua do Forum) retornou 'Rua do Forum'

mudou_de(Rua da Mantiqueira) retornou 'Rua Piaui, 718'

Funciona porque  a classe string cuida da alocação de memória

 

Espero ter ajudado

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...