Jump to content
Fórum Script Brasil
  • 0

Alterar um valor de texto através do ponteiro.


todiboa

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...