Ir ao conteúdo
  • Cadastre-se

Iniciando ponteiros em C


Geneglauber

Posts recomendados

Boa tarde pessoal, comecei agora pouco a estudar ponteiros em C mas ja de cara me deparei com um problema que nao consigo achar como resolver. Estou programando no terminal e utilizando gcc arquivo.c pra compilar. Eis o programa e o erro:

#include <stdio.h>
int main (void) {
  int x;
  x = 10;
  printf("%i\n", &x);
}

videoaula24.c: In function ‘main’:
videoaula24.c:8:3: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("%i\n", &x);
   ^

 

É estranho é que nao tem porque nao estar funcionando, mas esta '-'

Alguma luz?

 

Agradeço desde ja

 

 

Link para o comentário
Compartilhar em outros sites

Um ponteiro é um tipo especial de variável que guarda a direção(posição) de memoria onde está armazenada uma determinada variável. Todas as variáveis tem uma direção de memoria, incluindo os ponteiros, quando queremos saber a direção de memoria de qualquer variável, colocamos o operador de direção(também chamado de referencia) adiante de qualquer variável. Por o operador & adiante de uma variável, nos indica em que parte da memoria se encontra a mesma, um exemplo disso é o seu código, nele você está imprimindo a direção de x de colocando o operador & de forma que fique &x, e ademas você esta imprimindo ele como inteiro com o modificador %i, dai vem o aviso(não é um erro), você esta tentando imprimir um a direção de uma variável como se tratara de um inteiro, isso não é um erro pois em certos casos, podemos nos interessar por saber onde uma determinada variável se encontra na nossa memoria, mas o compilador não sabe isso, então ele te avisa emitindo um warning. você pode prevenir warnings introduzindo um casting de forma implícita adiante de &x, de forma tal que fique (int)&x, nesse caso o compilador toma como você sabe o que está fazendo, ele deixará de emitir o aviso, porém o resultado você deve recordar que está longe de ser o 10 que você guardou em x, se não que é a sua direção de memoria impressa como integer por causa do %i e do cast, o exemplo que ponho a continuação não emite erro algum pode provar.

#include <stdio.h>
int main (void) {
  int x;
  x = 10;
  printf("%i\n", (int)&x);
}

 

A sequencia disso é... 1º &x se extrai a direção em hexadecimal da variável, 2º (int) o converte a decimal, 3º o especificador %i mostra o valor como um inteiro, porém você pode usar normalmente um %d. O %i es de integer, e %d é de decimal, ambos mostram corretamente o valor em decimal, si quiser ver o resultado em hexadecimal, olhe o exemplo de ciroboy com o especificador %p para imprimir o ponteiro em hexadecimal.

Como falei antes, o que você precisa recordar é que uma variável do tipo ponteiro, guarda a direção de memoria de outra, por isso quando vamos a usar um ponteiro precisamos por o operador de direção & adiante da variável que vai ser apontada pelo nosso ponteiro, pois o que o ponteiro quer é a direção de memoria.
O exemplo a continuação mostra como trabalha um ponteiro:
//declaração de um ponteiro
int *p;

Com int *p estamos reservando memoria para alojar um valor, esse valor será a direção de outra memoria, agora devemos extrair a direção de memoria de um inteiro e jogar nesse p, isso se faz do seguinte modo:

p = &x;
agora é dizer... a variável p guarda a direção de x, não é *p = &x, isso seria um erro, você pode se confundir com int *p = &x; nesse caso você está fazendo duas coisas int *p + =&x, se fizer por separado é:
int x;
int *p;
p = &x;
depois para manipular x através de p você coloca * adiante de p
*p = 100; // atribuímos a x o valor 100 através de p

 

Ponteiros são um pouco confusos, porém são a arma mais potente que tem C frente a muitos outros linguagens, com o tempo você já não poderá viver sem ponteiros. >_<
Não avance sem ter entendido perfeitamente os ponteiros, pois custará muito mais trabalho avançar sem entender isso, tome-se seu tempo em compreender-lhe.




 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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