Autor Tópico: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)  (Lida 12359 vezes)

Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
[ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Online: 02 de Fevereiro de 2007, 20:10 »
Fala galera Ubuntu!

Bom sempre tive a dúvida sobre ponteiro duplo e algumas vezes usei sem sequer saber o porquê.
Eu gostaria de saber por que usam ponteiro duplo em alguns casos como os EXEMPLOS abaixo:
Citar
struct lista **salva;

 salva = (struct **)malloc(sizeof(lista));

bom o que eu não entendo é por que neste cast (ACHO EU QUE SEJA HEHE) tem ponteiro duplo e qual a finalidade:
Citar
(struct **)mallo...

Por favor se alguém puder usar um método simples para explicar eu agradeço muito, mas se não conseguir achar um, aceito o método dificil também hehehe.

Obrigado pessoal  ???

Offline Lamego

  • Usuário Ubuntu
  • *
  • Mensagens: 1.943
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #1 Online: 03 de Fevereiro de 2007, 09:26 »
Tentando o simples:
struct lista = estrutura lista
logo
struct lista ** = array dinamica de ponteiros para esrtururas lista

Tal como
int  = inteiro
int* = array dinamica de inteiros
int** = array dinamica de array de inteiros

Basicamente é forma de representar um array bidimensional
João Luís Marques Pinto
Mais programs e jogos para o Ubuntu

Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #2 Online: 03 de Fevereiro de 2007, 10:40 »
hummm deu pra entender, se tiver mais pessoas tambem ajuda valeu

Offline bruno.vitorino

  • Usuário Ubuntu
  • *
  • Mensagens: 76
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #3 Online: 03 de Fevereiro de 2007, 16:19 »
Se quiseres alocar dinamicamente um vector bidimensional (Matriz) com o malloc, por ex:

Código: [Selecionar]
int i;
int n_linhas = 3;
int n_colunas = 4;
int **rowptr;

rowptr = malloc(n_linhas * sizeof(int *)); //Aqui está a alocar dinamicamente o numero de linhas que o array vai ter

for(i = 0 ; i < n_linhas ; i ++)                                // Aqui está a alocar memoria para o numero de colunas
{                                                                              // que cada linha vai ter.
      rowptr[i] = malloc(n_colunas * sizeof(int));   //
}

Este tipo de alocação permite criar vectores dimensionais que não tenham um tamanho fixo de colunas por casa linha. Ou seja, permite por exemplo que uma linha tenha 3 elementos e outra apenas 1.
Se depois de ser alocada a memoria, for necessário aumentar o numero de colunas basta utilizar a função "realloc" e indicar o novo tamanho desejado.

Eu encontrei esse tutorial sobre ponteiros em C, dá uma olhada
http://br.geocities.com/cesarakg/pointers.html#toc17
« Última modificação: 03 de Fevereiro de 2007, 16:36 por bruno.vitorino »
persistência, persistência,persistência...



Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #4 Online: 03 de Fevereiro de 2007, 18:45 »
hummmm valeu cara ...

seguinte porque quando vao alocar memoria eles fazem um cast estilo esse:


(tipo **)malloc( sizeof(tipo*)*N )


obs: N = só um exemplo.,

por que não pode colocar só 1 asterisco? :

(tipo *)malloc( sizeof(tipo*)*N )
.....

se eu fizer um ponteiro

char ** variavel;

significa que variavel é um ponteiro de ponteiro certo? Ou seja, tem um ponteiro intermediario. Então a questão é como acessar o valor do ponteiro intermediario e pra que ele serve?

posso fazer isso:

variavel[0][0] = 1;
variavel[0][1] = 2;

????

Obrigado ???

Offline bruno.vitorino

  • Usuário Ubuntu
  • *
  • Mensagens: 76
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #5 Online: 03 de Fevereiro de 2007, 22:00 »
Tens de colocar sempre os dois asteriscos para o cast correcto, pois a variável é do tipo ponteiro de ponteiro, logo é necessário dizer ao compilador o tipo correcto.

.......

Realmente é um ponteiro de ponteiros. O primeiro ponteiro serve para apontar o local da primeira posição do array principal, o ponteiro intermediário serve para simbolizar cada ponteiro que aponta para os novos arrays.

A forma mais simples de aceder aos conteúdo da matriz é como tu referiste

variavel[0][0] = 1;

Fiz um esquema, pode ser que ajude a compreender melhor.


persistência, persistência,persistência...



Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #6 Online: 03 de Fevereiro de 2007, 22:14 »
Bruno.Vitorino, primeiramente muito obrigado pela tua ajuda.

e por fim gostaria, CASO VOCÊ QUEIRA, de um exemplo:

Um programa usando ponteiro bidimensional que faça uma matriz:

1 2
3 2

cada campo pode ser preenchido pelo programa .

bom apos feita a matriz eu gostaria que o programa exibisse na tela os valores de
matriz
  • [y] em que  0=<x <=1 e    y igualmente.


obrigado..eh bem facil o9 programa...

vai servir para eu entender melhor...valeu

Offline bruno.vitorino

  • Usuário Ubuntu
  • *
  • Mensagens: 76
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #7 Online: 03 de Fevereiro de 2007, 22:35 »
Um bom exercício seria tu fazeres e se não funcionar eu posso e os colegas poderão tentar ajudar para corrigir a solução apresentada por ti.
No tutorial existe informação suficiente para conseguires fazer o que me pedes.
Estás a precisar desse programa para a escola ou algo semelhante? Parece-me que estás a tentar que faça trabalho por ti  ;D
persistência, persistência,persistência...



Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #8 Online: 03 de Fevereiro de 2007, 23:53 »
Não cara ainda nem entrei em CIencia da computação hehehe...só tenho uma paixão por programação mesmo... fiz um programa

Citar
#include <curses.h>
#include <stdlib.h>

#define CTE 2
 int i;
 int ** matriz;

int main()
  {
   initscr();

   matriz = (int **) malloc(sizeof(int *)*CTE );
   if(matriz == NULL)
     {
      printw("Erro ao alocar memória");
      free(matriz);
     }

   for(i==0;i==1;i++)
       {
   matriz = (int *)malloc(CTE * sizeof(int *) );
   if(matriz==NULL)
    {
     printw("Erro ao alocar memoria");
      free(matriz);
    }
       }
        matriz[0] = 2;
        matriz[1] = 1;

    printw("%d %d", matriz[0],matriz[1]);
    getch();
    free(matriz);
    endwin();

    return 0;
  }


Depois desse programa ficou show entender ponteiros cara... o seu desenho ajudou MUITO..agradeço de coração abraços ae..


Para evitar de abrir um novo tópico aqui segue uma outra dúvida:

1. Como salvar uma Struct e depois acessa-la ?

por exemplo tenho nome telefone endereço e cidade...

como faço pra salvar e depois digitando um dos 4 campos recuperar todos os dados? (apos fechar o programa, ou seja, ficar salvo em um arquivo)

Offline bruno.vitorino

  • Usuário Ubuntu
  • *
  • Mensagens: 76
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #9 Online: 04 de Fevereiro de 2007, 13:32 »
Essa já é uma questão mais complexa. Tens de fazer uma funções para escreve para um ficheiro, cada elemento da estrutura.
Há duas hipóteses de escrita, uma em formato de texto e outra em formato binário.
Já não me lembro como se faz isso exactamente, mas tem ideia que o formato de texto usa a função fprintf().
Depois para ler, terás que ter funções que leiam o ficheiro da forma que o escreveste e insiram para a estrutura novamente.

Para trabalhar com ficheiros, tem aqui um pdf em a instrodução e alguns exemplos de utilização.
http://www.estg.ipleiria.pt/files/323796_Prog%20I_Cap7_Ficheiro_457eea475a5d2.pdf
persistência, persistência,persistência...



Offline solanoalves

  • Usuário Ubuntu
  • *
  • Mensagens: 398
  • Arch Linux
    • Ver perfil
Re: [ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)
« Resposta #10 Online: 04 de Fevereiro de 2007, 15:52 »
Valeu cara!...