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

ponteiros


Chibirca

Pergunta

olá galerinha . . . sou novato no C, mas gosto muito ! estudei o capitulo de ponteiros fiz uma serie de prgms, mas não consigo reconhecer quais as vantagens de usar ponteiros, o que eu ganho fazendo um mesmo prgm usando ou não usando ponteiros ? Me ajudem por favor . . . com seus comentários . . . :rolleyes:

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

vixe se eu lembro direito acho q as vantagens do ponteiro são você modificar o valor da variavel em uma funcao e ele permanecer alterado pro programa todo.

por exemplo, você cria um ponteiro no main() e passa como parametro pra uma funcao qualquer. ai você alterando o valor la dentro, ele vai continuar alterado quando você voltar pra main(). é como passar variaveis por referencia (byRef no Visual Basic) em outras linguagens.

Link para o comentário
Compartilhar em outros sites

  • 0
olá galerinha . . . sou novato no C, mas gosto muito ! estudei o capitulo de ponteiros fiz uma serie de prgms, mas não consigo reconhecer quais as vantagens de usar ponteiros, o que eu ganho fazendo um mesmo prgm usando ou não usando ponteiros ?

Poderíamos considerar também a importância no sentido de que você pode fazer uso de alocação dinâmica, ou seja, reservar espaço de memória em tempo de execução.

Quando você declara:

char Vet[30], está reservando espaço em memória para 30 caracteres para a variável Vet;

Já se você declarar:

char *vet, estará reservando apenas o tamanho destinado a um ponteiro.

Assim, vamos supor que o texto a ser colocado nestas variáveis não tenha um tamanho pré-determinado. Ao utilizar um tamanho fixo, você deverá dimensionar o tamanho da variável de modo a receber com segurança um número "x" de caracteres, o que provocará um uso excessivo da memória.

Vamos a um exemplo para tentar entender a diferença entre guardar um valor em uma variável de tamanho fixo e dinâmico:

# include "conio.h"

void main()
{
  char Vet[30];
  char *vet;
  int  size_to_alloc=40;

  clrscr();  /* limpa a tela*/

  memset(Vet, 0, sizeof(Vet));  /* inicializamos o vetor com  */
  printf("Entre valor para vetor fixo: ");
  gets(Vet);  /* lê o texto fixo */

  vet=(char *)malloc(size_to_alloc);  /* Aloca memória para vetor dinâmico */
  memset(vet, 0, size_to_alloc);  /* inicializamos o vetor com  */
  printf("Entre valor para vetor dinamico: ");
  gets(vet);  /* lê o texto do vetor dinâmico */

  printf("%s sizeof:%d length:%d\n%s sizeof:%d length:%d\n",
    Vet, sizeof(Vet), strlen(Vet),
    vet, sizeof(vet), strlen(vet));
  getch();   /* pausa até que algo seja pressionado */

  free(vet); /* libera memoria alocada */
}
Execute o programa, e informe para ambos os campos solicitados o mesmo texto. Observe o resultado apresentado. Mas, este exemplo praticamente não mostra nada. A diferença será melhor visualizada se, agora, acrescentarmos um loop para ler 5 valores e armazená-los em um vetor. Em cada posição deste vetor armazenaremos uma string (texto). Se o tamanho de cada posição do vetro for fixo, no ex. 50, então a área ocupada será de 5*30=150bytes. Mas considerando que o texto entrado, não necessariamente terá o comprimento máximo de 30 caractres, então utilizando alocação dinâmica poderemos diminuir o consumo de memória. Veja este exemplo:
# include "conio.h"

void main()
{
  int idx;
  int size_used=0;
  char buffer[30];
  char *Lista[5];  /* declaramos uma lista de ponteiros para char */

  clrscr();  /* limpa a tela*/

  memset(Lista, 0, sizeof(Lista));  /* inicializamos o vetor com  */
  memset(buffer, 0, sizeof(buffer));  /* inicializamos o vetor com  */

  for(idx=0;idx<=4;idx++){
    printf("Entre valor para posi‡„o %d na Lista: ", idx+1);
    gets(buffer);  /* le o texto fixo */

    Lista[idx]=(char *)malloc(strlen(buffer)+1);  /* Aloca memória para o array de char na posição idx da nossa Lista */
    strcpy(Lista[idx], buffer);  /* copia */
    size_used+=strlen(Lista[idx]);
    printf("Foram alocados: %d bytes\n", strlen(Lista[idx])+1);
  }

  printf("\nTamanho de buffer (sizeof): %d bytes", sizeof(buffer));
  printf("\nSe armazenassemos em cada item da lista \num vetor como buffer (fixo), ocuparíamos (5*%d): %d bytes", sizeof(buffer), sizeof(buffer)*5);
  printf("\nComo armazenamos so o necessario (dinamico), ocupamos apenas %d\n", size_used);
  getch();   /* pausa até que algo seja pressionado */

  for(idx=0;idx<=4;idx++){  /* libera toda a memória alocada */
    free(Lista[idx]);
  }
}

Veja se estes exemplos lhe servem de algum modo. (espero que sim)

Abraços

p.s. o código foi compilado com o Turbo C

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...