Jump to content
Fórum Script Brasil
  • 0

ponteiros


Chibirca

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...