Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Dúvida - Ponteiros


Fantomas

Pergunta

Sei que ponteiros (*) apontam para um endereço na memória e que o operador (&) retorna esse endereço, mas isso não me ajudou a responder essa pergunta. Por que as vezes quando não uso o "&" o programa segue sem erros e outras vezes preciso usá-lo? Quais os casos em que ele é necessário?

Exemplo1:

Deu certo

int h;

printf("Digite um valor: ");

scanf("%d",&h);

printf("%c",h);

Deu Errado

int h;

printf("Digite um valor: ");

scanf("%d",h);

printf("%c",h);

Exemplo2:

Deu certo

char n[20];

printf("Qual a cor da casa?");

scanf("%s",n);

printf("%s",n);

Deu certo

char n[20];

printf("Qual a cor da casa?");

scanf("%s",&n);

printf("%s",n);

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Entendi, mas o & não só retorna um endereço da memória? O que ele faz no scanf("%d",&h); pega um endereço retornado qualquer

pra armazenar o valor?

Cara, funciona assim:

O operador * indica que o valor a ser usado na operação está no endereço em que a variável que o segue tem como valor.

O operador & indica que o valor a ser usado na operação é o endereço da variável que o segue.

O operador [num] indica que o valor a ser usado na operação está no endereço que equivale ao valor da variável que o antecede mais o valor de num.

Resumindo:

var ----> valor de var

&var --> endereço de var

*var --> valor apontado por var

Suponha:

var está no endereço 0x13333337 onde há o valor 6:

&var equivale à 0x13333337;

var equivale à 6;

*var equivale ao que está no endereço de memória 6.

ptr está no endereço 0x12345678 onde há o valor 0x13333337:

&ptr equivale à 0x12345678;

ptr equivale à 0x13333337 (&var);

*ptr equivale ao uso de 6 (var).

Exemplo:

#include <stdio.h>

int main(void)
{
  char str[] = "Sou uma string";
  char *ptr;
  ptr = str;

  printf("str[0] = *ptr --> %c = %c\n", str[0], *ptr);
  printf("str[1] = *(ptr + 1) --> %c = %c\n", str[1], *(ptr + 1));
  printf("str[2] = *(ptr + 2) --> %c = %c\n\n", str[2], *(ptr + 2));

  printf("Endereco de ptr (&ptr): %x\n", &ptr);
  printf("Endereco de str (&str): %x\n", &str);
  printf("Valor de ptr (ptr): %x\n", ptr);
  printf("Valor de str (str): %x\n", str);
  printf("Valor apontado por ptr (*ptr): %c\n", *ptr);
  printf("Valor apontado por ptr (*str): %c\n", *str);

  return 0;
}
Saída:
C:\djgpp\mystuff\testes>ptrarray
str[0] = *ptr --> S = S
str[1] = *(ptr + 1) --> o = o
str[2] = *(ptr + 2) --> u = u

Endereco de ptr (&ptr): 8ff20
Endereco de str (&str): 8ff25
Valor de ptr (ptr): 8ff25
Valor de str (str): 8ff25
Valor apontado por ptr (*ptr): S
Valor apontado por ptr (*str): S

C:\djgpp\mystuff\testes>
Em C, passagem de parâmetros, para uma função pode ser feita de dois modos: passagem por valor ou passagem por referência. Na passagem por valor, passa-se o valor da variável. Na passagem por referência, passa-se o endereço da variável, podendo-se derreferenciá-la (*) na função chamada e alterar o valor da variável da função chamadora. A função printf() recebe o valor de uma variável para mostrá-lo, mas não o altera; portanto há uma passagem por valor para a função. A função scanf muda o valor de uma variável, portanto precisa saber seu endereço. Exemplo:
#include <stdio.h>

void valor(int var)
{
  printf("valor() --> &var = %x ----> Diferente do &var em main().\n", &var);
  printf("valor() --> var = %x\n", var);
  var = 2;
  printf("valor() --> Agora var = %x\n", var);
}

void referencia(int *var)
{
  printf("referencia() --> &var = %x\n", &var);
  printf("referencia() --> var = %x ----> Igual a &var em main().\n", var);
  printf("referencia() --> *var = %x\n", *var);
  *var = 2;
  printf("referencia() --> Agora *var = %x\n", &var);
}

int main(void)
{
  int var = 0x80;

  printf("main() --> &var = %x\n", &var);
  printf("main() --> var = %x\n\n", var);
  valor(var);
  printf("\nmain() --> var = %x\n\n", var);
  referencia(&var); /* O & indica que passamos o endereço de var */
  printf("\nmain() --> var = %x\n", var);

  return 0;
}
Saída:
C:\djgpp\mystuff\testes>funcval
main() --> &var = 8ff30
main() --> var = 80

valor() --> &var = 8ff10 ----> Diferente do &var em main().
valor() --> var = 80
valor() --> Agora var = 2

main() --> var = 80

referencia() --> &var = 8ff10
referencia() --> var = 8ff30 ----> Igual a &var em main().
referencia() --> *var = 80
referencia() --> Agora *var = 8ff10

main() --> var = 2

C:\djgpp\mystuff\testes>
[EDIT] Cara, as vezes aprender por teoria é complicado, até pra escrever isso tive que revisar algumas vezes. No fundo, é como se a função scanf() fosse declarada assim (é só uma simplificação):
void scanf(char *format, int *arg1, int *arg2...);
recebendo referências das variáveis; enquando printf()
void printf(char *format, int arg1, int arg2...); // Valores.
P.S.: scanf() na verdade é declarada assim:
int scanf( const char *format, ... );

mas isso é outra estória, caso queira sabê-la e caso entenda Inglês dê uma olhadela em http://www.eskimo.com/~scs/cclass/int/sx11b.html .

Até mais!

Editado por == Douplus ==
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...