Ir para conteúdo
Fórum Script Brasil
  • 0

Alterar um valor de texto através do ponteiro.


todiboa

Pergunta

Pessoal estou fazendo um execícios para a facul de linguagem C, onde preciso alterar os valores das variáveis através de seus ponteiros mas não estou conseguindo. Alguém pode me ajudar, segue o comando:

#include <stdio.h>
#include <stdlib.h>

int main (){
 //Declarando ponteiros
 char *Carro;
 int *Ano;
 float *preço;

 //Declarando variaveis
 char carro[8] = {"Kadett"};
 int ano = 1996;
 float preço = 10000;

 //Os ponteiros aponta os elementos de cada uma das variaveis.
 //Desta maneira os ponteiros apontam para os elementos 0.
 Carro = carro;
 Ano = &ano;
 preço = &preço;
  
 //Imprimindo os valores das variaveis
 printf("Veiculo.......: ");
 puts(Carro);
 printf("Ano.........: %d\n", *Ano);
 printf("preço.......: %f\n\n", *preço);
 system("pause");

 //Trocando os valores das variaveis atraves dos ponteiros

 *Carro = {"Corsa"};
 *Ano = 2002;
 *preço = 18000;
 printf("\n\n");
 printf("Veiculo.....: ");
 puts(Carro);
 printf("Ano.....: %d\n", *Ano);
 printf("preço.....: %f\n", *preço);
 system("pause");

return 0;    
}

Notem que consigo alterar os valores das variáveis como int e float, mas do tipo char da erro no compilador e não sei mais como proceder.

Por favor, me ajudem!!!

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Strings são mais complicadas de mexer, porque ela própria jé é um ponteiro. Pra copiar strings, só usando a função strcpy(), ou fazendo sua própria função pra copiar strings.

Pra variar, dexa eu postar mais umas das minhas explicações de 1000 linhas desnecessárias...

Bom, toda string, todo array também são ponteiros.

Isso é um ponteiro:

char *Carro;
Isso é outro ponteiro:
char carro[8]
Isso também é um ponteiro, temporário:
"Corsa"
Um ponteiro nada mais é que uma variável que guarda uma posição de memória. É um simples número inteiro. Por exemplo, o ponteiro Carro pode ter lá dentro um valor igual a 12345. Isso significa que ele aponta para a posição 12345 da memória. E lá na posição 12345 da memória é que você pode ter uma texto qualquer, por exemplo "Kadett". O ponteiro serve para apontar para esse endereço. Se eu usar a variável Carro diretamente, estou acessando o valor desse ponteiro. Se usar a variável *Carro adicionando o asterisco na frente, estou acessando o valor na posição de memória a que esse ponteiro aponta. Percebeu a diferença?? Exemplo:
int x = 5;
int *y;

y = &x; //Aponto y para a posição de memória onde está x.

//Sem asterisco -- vai mostrar a posição de memória onde está a variável x:
printf("O ponteiro Y aponta para a seguinte posição da memória: %d\n", y);
//Com asterisco -- vai mostrar valor 5:
printf("Na posição de memória pra que Y aponta tenho o seguinte valor: %d\n", *y);.[/code] Se não me engano, nem todos os compiladores aceitam o primeiro printf() do código acima (talvez convertendo pra int), mas o importante era ilustrar pra você entender. Note também que quando você fez isso:
[code]Carro = carro;
Você não precisou usar o operador & na variável carro, pois ela prória já é um ponteiro. Ou seja, escrevendo somente carro, você já consegue encontrar a posição onde está sua string. Sendo assim, quando faço isso:
*Carro = {"Corsa"};
Que, pra simplifcar, e como não tenho certeza se aquelas chaves chegam a afetar (e a não ser que alguém me corrija, recomendo que não as use), escreverei assim:
*Carro = "Corsa";
Note que "Corsa" também é um ponteiro, porém temporário. Quando você escreve "Corsa", você não está acessando diretamente o texto "Corsa", e sim um ponteiro que aponta pra um outro local na memória onde está escrito "Corsa". Sendo assim, "Corsa" não vai retornar pra você uma string, e sim um ponteiro, um número inteiro. Por outro lado, *Carro, com asterisco, vai te levar diretamente para a posição da memória onde está o texto pra que esse ponteiro aponta. Ou seja, a linha de código acima vai tentar copiar um ponteiro pra dentro da string -- ou um número pra dentro de um texto. O que seria possível somente com as devidas conversões, mas não ia levar ao resultado que você quer. O que você quer seria fazer o ponteiro Carro levar ao texto "Corsa", correto?? O único jeito de fazer é isso, é copiar caractere por caractere da string origem (o texto "Corsa") para a string destino (o ponteiro Carro). Por sorte, já existe uma função que faz isso pra você. Ela se chama strcpy() e encontra-se dentro de "string.h", veja: http://www.cplusplus.com/reference/clibrary/cstring/strcpy/ Note que o código abaixo, aparentemente funcionaria, pois você faria o ponteiro Carro apontar diretamente para o ponteiro onde está "Corsa":
Carro = "Corsa";

Mas este código não é eficaz e pode trazer seríssimos problemas, pois como eu já disse antes, "Corsa" é uma string temporária. Ela dura somente enquanto a instrução estiver sendo executada e é liberada da memória logo depois. Ou seja, seu ponteiro Carro estará apontando pra um espaço desalocado de memória o que é um grande perigo, pois a qualquer momento, outro processo pode passar a usar essa posição, e, tentar acessar esse espaço a partir do seu programa vai dar crash no seu programa no mesmo instante.

Ou ainda, o seu próprio programa pode acabar ocupando a posição onde antes estava "Corsa" com uma nova variável, o que vai fazer com que o valor contido dentro da string Carro se altere sem que você saiba.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...