Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

felipecesar

Estrutura de dados em C

Recommended Posts

A minha dúvida é a seguinte, em relação a ponteiros.

 

#define MAX 10

 

typedef struct {
  int elementos[MAX];
  int topo;
} pilha;

 

  Citar
MAIN

pilha p; //declaro uma variável p do tipo da estrutura que foi criada
empilha(&p,13);
empilha(&p,13);

 

int empilha(pilha *p, int dado) {
   if(cheiaPilha(*p)) //Primeira pergunta - Porque não posso utilizar cheiaPilha(p) aqui? Tem que ser exclusivamente um ponteiro?
      return 0;

  (p->topo)++;
   p->elementos[p->topo]=dado;
   return 1;

 

A segunda pergunta é a seguinte:

A chamada por referência em empilha(&p,13), faz uma cópia para a função que declara um ponteiro, só que nos ponteiros eles vão armazenar os endereços da variavel p?

endereospilhas.png

 

em p.topo, p.elementos[0], p.elementos[1] ficaria os valores e em p->topo, p->elementos[1], ficaria os endereços das variáveis de p? É isso? Ou lista *p, teria apenas uma "palavra" da memória no qual guarda o primeiro endereço da memória p?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um ponteiro para um tipo de struct é um ponteiro como outro qualquer. Depois da declaração 'pilha *p;', p é de tipo 'ponteiro para pilha', e *p é de tipo 'pilha'. O operador '.' deve ter como operando um objeto de tipo de struct - no seu caso, 'pilha'. Portanto, para acessar o membro 'elementos' do objeto de tipo 'pilha' para o qual p aponta, usamos '(*p).elementos'. O operador '->' deve ter como operando um ponteiro para algum tipo de struct - no seu caso, 'ponteiro para pilha'. Sabendo disso, basta aprender que 'p->elementos' é equivalente a '(*p).elementos'.

 

int *pi; // pi é ponteiro para int, *pi é int
pilha *p; // p é ponteiro para pilha, *p é pilha

// (*p).a equivale a p->a

 

Há algo mais que você precisa entender. Em C, todas as passagens de argumentos são por valor - quando se diz que se passa um argumento por 'referência', passa-se o valor de um ponteiro. Este valor é então armazenado em um objeto (criado especialmente para a execução da função que o recebe) cujo valor é o endereço do objeto cujo endereço foi produzido via '&'. No caso de arrays a regra se mantém já que o valor de um array é sempre um ponteiro para seu primeiro elemento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.