Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: solanoalves em 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:
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:
(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 ???
-
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
-
hummm deu pra entender, se tiver mais pessoas tambem ajuda valeu
-
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 (http://br.geocities.com/cesarakg/pointers.html#toc17)
-
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 ???
-
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.
(https://ubuntuforum-br.org/proxy.php?request=http%3A%2F%2Fimg412.imageshack.us%2Fimg412%2F9114%2F0002ul7.th.png&hash=e15bda81a71eb5550d9dfa092613f5776fbad96f) (http://img412.imageshack.us/my.php?image=0002ul7.png)
-
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
-
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
-
Não cara ainda nem entrei em CIencia da computação hehehe...só tenho uma paixão por programação mesmo... fiz um programa
#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)
-
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 (http://www.estg.ipleiria.pt/files/323796_Prog%20I_Cap7_Ficheiro_457eea475a5d2.pdf)
-
Valeu cara!...