Ir ao conteúdo

Posts recomendados

Postado

Olá. Estou com um problema onde nao estou conseguindo mostrar aquele resultado da idade. Na verdade é um código teste pois não sei como passar um valor dessa forma.

 

struct pessoa{

	int idade[2];
};

struct carro{
	int carro[2];
};







main(){
	struct pessoa pessoas[2], *p;
	struct carro Carro[2], *c;

	
		int i=0;
		(p + i)->idade[i] = 1;
		printf("%d",(p+i)->idade[i]);
		
	
	
	
	
	
}

 

  • Obrigado 1
Postado

Ali depois de int i=0; coloque essa linha abaixo:
p = pessoas;

é que o ponteiro p não tá apontando pra um endereço válido. Nessa linha acima, ele vai apontar pro endereço do vetor 'pessoas'.

Postado
Em 17/08/2019 às 12:51, Igor Vargas disse:

não sei como passar um valor dessa forma

 

Olá

 

Talvez sua dúvida seja como acessar as variáveis dentro das estruturas. Veja esse código, que usa seu exemplo, e talvez ajude a entender. Pessoa está declarada assim:

struct Pessoa
{
    int idade[2];
};

struct Pessoa	pessoas[2];

E você pode preencher assim:

    // sao duas Pessoa, em cada pessoa duas idades
    pessoas[0].idade[0] = 0;
    pessoas[0].idade[1] = 1;
    pessoas[1].idade[0] = 2;
    pessoas[1].idade[1] = 3;

Claro, para a estrutura Carro é igualzinho e não vou repetir para que você não se canse ;) 

Note que para entender ajuda se você usar valores distintos e conhecidos para cada idade em cada pessoa, como fiz aqui usando 0,1,2 e 3. Imagino que por isso você tenha declarado int idade[2];

E os ponteiros são declarados assim:

struct Pessoa* p;

Então se escrever 

    p = pessoas;

p vai apontar para a primeira das pessoas[], pessoas[0], e ao escrever

p = p + 1;

p passa a apontar para a segunda. E por isso a aritmética de ponteiros é tão útil em C.

E se você escrever p = p + 1 de novo tudo bem. Mas como não tem pessoas[2] se você tentar acessar *p de novo seu programa irá para o espaço, e por isso essas coisas dão tanto erro :D 

 

Esse programa

#include "stdio.h"

struct Pessoa
{
    int idade[2];
};
struct Pessoa    pessoas[2];
struct Pessoa* p;

struct Carro {
    int carro[2];
};
struct Carro    carros[2];
struct Carro* c;

int main( 
    int argc,
    char** argv
)
{

    // sao duas Pessoa, em cada pessoa duas idades
    pessoas[0].idade[0] = 0;
    pessoas[0].idade[1] = 1;
    pessoas[1].idade[0] = 2;
    pessoas[1].idade[1] = 3;

    // sao dois Carro , em cada carro dois carro :)
    carros[0].carro[0] = 0;
    carros[0].carro[1] = 1;
    carros[1].carro[0] = 2;
    carros[1].carro[1] = 3;

    // p vai apontar para a primeira Pessoa, pessoas[0]
    printf("p vai apontar para a primeira pessoa...\n");
    p = pessoas;
    printf("idades em *p: %d e %d\n", p->idade[0], p->idade[1]);
    // p vai apontar para a segunda Pessoa, pessoas[1]
    p = p + 1;
    printf("somando um em p vai passar para a proxima pessoa...\n");
    printf("idades em *p: %d e %d\n", p->idade[0], p->idade[1]);

    // listando os valores em carros 
    printf(
        "valores de carro[] em carros[]: %d \t %d \t %d \t %d\n",
        carros[0].carro[0],
        carros[0].carro[1],
        carros[1].carro[0],
        carros[1].carro[1]
    );
    return  0;
}

mostra isso:

p vai apontar para a primeira pessoa...
idades em *p: 0 e 1
somando um em p vai passar para a proxima pessoa...
idades em *p: 2 e 3
valores de carro[] em carros[]: 0        1       2       3

C:\Users\toninho\source\repos\ch-struct\Debug\ch-struct.exe (process 11452) exited with code 0.

Mais uma nota:

Em geral e em especial para quem está aprendendo recomendo declarar as coisas como elas são de fato e em separado, para ajudar a fixar claramente o que está acontecendo. Exemplo:

struct pessoa pessoas[2], *p;

Declarar *p como uma struct pesssoa está  correto. Mas estamos declarando p e ao declarar

struct Pessoa* p;

p de fato é struct* pessoa

 

e então fica claro para o aluno e o leitor que a variável declarada, p, é um ponteiro para uma struct do tipo pessoa. Ao escrever struct pessoa *p isso se perde um pouco: estamos declarando *p ou p? Só um palpite, nem quero iniciar um debate :D mas estamos declarando p...

adicionado 55 minutos depois
Em 17/08/2019 às 12:51, Igor Vargas disse:

int i=0;
(p + i)->idade[i] = 1;
printf("%d",(p+i)->idade[i]);

 

 

Esqueci de comentar esse código...

Está ok, apenas p não aponta para lugar algum.

 

acrescente antes uma dessas

p= pessoas;		// aponta para a primeira pessoa
p= &pessoas[0]; 	// aponta para a primeira
p= &pessoas[1];		// aponta para a segunda pessoa

 

  • Curtir 1

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