Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Geneglauber

Iniciando ponteiros em C

Recommended Posts

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

 

 

Editado por dif
Usar a tag CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

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

  return 0;
}


&x é o endereço da variável x, é equivalente a um ponteiro. se quiser imprimir a variável, faça assim:
 

printf("%d\n", x);

 

  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu CiroBoy e VangoDP, as duas dicas foram muito úteis e consegui resolver!!

 

@vangodp O casting pra int gerou um warning avisando que o tamanho era diferente. então converti pra long e funcionou :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×