[ C ] Qual a finalidade do ponteiro duplo? (ex: struct lista **salva;)

Iniciado por solanoalves, 02 de Fevereiro de 2007, 20:10

tópico anterior - próximo tópico

solanoalves

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  ???

Lamego

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

solanoalves

hummm deu pra entender, se tiver mais pessoas tambem ajuda valeu

bruno.vitorino

#3
Se quiseres alocar dinamicamente um vector bidimensional (Matriz) com o malloc, por ex:

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
persistência, persistência,persistência...



solanoalves

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 ???

bruno.vitorino

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...



solanoalves

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

bruno.vitorino

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...



solanoalves

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)

bruno.vitorino

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...



solanoalves