Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
A minha dúvida é a seguinte, em relação a ponteiros.
#define MAX 10
typedef struct {
int elementos[MAX];
int topo;
} pilha;
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?
/applications/core/interface/imageproxy/imageproxy.php?img=http://img849.imageshack.us/img849/8657/endereospilhas.png&key=c3e36e4ca37af2e767387afc0ebf1d89dec1663f329e6750f97a2ac71f1f7a87" alt="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?
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.