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

Ponteiros e Estruturas


Math_naVeia

Pergunta

1)

Quando eu faço isso :

struct horario {

         int hora;

         int minuto;

         int segundo;

};

struct horario agora;

struct horario *Horarios;

 

estou criando uma variável do tipo struct horario que se chama agora e, consequentemente, com os campos hora, minuto e segundo. Mas o ponteiro *Horarios é na verdade como qualquer ponteiro que guarda o endereço de uma outra variável, certo ? Ou seja, a instrução struct horario *Horarios;  não quer dizer que está sendo criada uma variável do tipo struct horario com os campos hora, minuto e segundo, mas, na verdade, está sendo apenas criada uma variável que guarda um endereço de uma variável do tipo struct horario. É isso ?

 

2)

Quando eu faço isso :

struct horario {

    int *pHora;

    int *pMinuto;

    int *pSegundo;

};
 

void main () {

struct horario hoje;

int hora = 12;

int minuto = 30;

int segundo = 58;

 

hoje.pHora = &hora;

hoje.pMinuto = &minuto;

hoje.pSegundo = &segundo;

 

cout << "Hora : " << *hoje.pHora << endl;

cout << "Minuto : " << *hoje.pMinuto << endl;

cout << "Segundo : " << *hoje.pSegundo << endl;

}

 

Os membros da estrutura são os ponteiros ( hoje.pHora, hoje.pMinuto, hoje.pSegundo ) ou são as variáveis apontadas por eles (hora, minuto, segundo) ?

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

1-Um ponteiro é a mesma coisa em qualquer caso. Para não se complicar muito, melhor recorde que um ponteiro é uma variável que guarda a direção de memória de outra variável do mesmo tipo, não guarda dados, funciona igualmente em todos os casos, ele não guarda valores se não direções, lembre disso.

2-acho que a resposta anterior já responde isso... um ponteiro é uma variável que guarda a direção de memória de outra variável do mesmo tipo, por isso devemos fazer coisas como hoje.pHora = &hora. O operador & "entrega" a  hoje.pHora a direção de  hora, em outras palavra, se eu ponho & adiante de uma variável eu quero a direção da memória, mas se eu por *eu quero o valor que tem a variável "indiretamente" através do ponteiro. E como um ponteiro guarda direções é ilógico fazer coisas como hoje.pMinuto = *minuto, o certo é hoje.pMinuto = &minuto.

Espero ter ajudado, se tiver duvidas pergunte.

Link para o comentário
Compartilhar em outros sites

  • 0

1) Ok.

2) Veja se entendi...Uma estrutura de dados tem por objetivo armazenar dados, valores. Então como os ponteiros apenas guardam direções, quando faço esse pedaço de código

struct horario {

    int *pHora;

    int *pMinuto;

    int *pSegundo;

};

estou apenas criando variáveis que vão apontar onde estão esses dados, portanto os membros da estrutura são, na verdade, hora, minuto e segundo, onde os dados serão realmente armazenados. Correto ?

 

Link para o comentário
Compartilhar em outros sites

  • 0
5 horas atrás, Math_naVeia disse:

hora, minuto e segundo, onde os dados serão realmente armazenados. Correto ?

 

Sim!

Veja um caso curioso...
Se pegar e enviar essa estrutura a um arquivo, você estará enviando 3 direções de memória na qual estaria armazenadas horas, minutos e segundos, porem se tentar ler esses dados do arquivo, na realidade você estaria obtendo a direção onde estavam os dados anteriormente, porem o programa poderia(e certamente terá) esses dados em outra parte, se tentar manipular essas direções você pode causar um desastre no seu sistema, pois nessa direção já não estariam as variáveis que você quer, e sim pode haver algum dado critico, dai você vai tentar manipula-lo e pode dar um erro de segmento ou algo pior, certamente o windows mostraria um aviso(ou pode que não). >_< Por esse motivo você precisa certificar de nunca enviar estruturas que contenham ponteiros a arquivos, si não de enviar cada dado por separado, dai você envia o conteúdo da variável apontada pelo ponteiro, e não o valor que armazena o ponteiro já que é um int que representa a direção de memória que de nada vai te servir. então em vez de enviar struct ao arquivo você envia struct->pHora, struct->pMinuto e struct->pSegundos, e para ler faça o processo contrario. Ok?! XD

chau!

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Faz assim, para melhorar tua visualização:
 

typedef struct horario /*Typedef serve para você apelidar sua struct*/
{
	int hora; /*Aqui a galera boa*/
	int minuto;
	int segundo;
}Horario;	/*Aqui, no fim, o novo nome da tu struct*/

/*Ai você usa assim:*/

Horario agora;/*Sacou? fica tipo a declaração de um tipo primitivo(exemplo: "int var")*/

Horario *horario;/*Acompanhando a linha de cima("int *pVar")*/

/*Mas para você usar a linha de cima, tem que alocar essa struct: segue abaixo*/

horario = (Horario*)malloc(sizeof(Horario));
if(horario!=NULL){/*Ou seja, se foi alocada*/
	/*você usa*/
}else{
	exit(1);
}





Se ajudei, comenta, senão, comenta do mesmo jeito ;)

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...