hristosax Posted October 3, 2009 at 12:39 PM Report Share #289776 Posted October 3, 2009 at 12:39 PM Estou a aprender C++, e estou na fase dos ponteiros. mas não percebo o que são e o que fazem! Alguem me explica? Brigadinho. Link to comment Share on other sites More sharing options...
bruno1234 Posted October 3, 2009 at 01:13 PM Report Share #289781 Posted October 3, 2009 at 01:13 PM Existe aqui no fórum um tópico em C com a mesma dúvida onde tens a explicação p isso. Ponteiros em C são iguais aos de C++, podes ler a explicação á vontade. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos Link to comment Share on other sites More sharing options...
pedrosorio Posted October 3, 2009 at 01:37 PM Report Share #289784 Posted October 3, 2009 at 01:37 PM https://www.youtube.com/embed/6pmWojisM_E?feature=oembed =D Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
hristosax Posted October 3, 2009 at 02:16 PM Author Report Share #289794 Posted October 3, 2009 at 02:16 PM https://www.youtube.com/embed/6pmWojisM_E?feature=oembed =D o que nao percebo é Para quê fazer um ponteiro int chamado x, e apontá-lo para o "int num = 5", se simplesmente posso chamar o "num"! Não percebo a utilidade. Para quê ter um conjunto de ponteiros se posso ter uma array de variaveis? Link to comment Share on other sites More sharing options...
Ferreira Posted October 3, 2009 at 02:41 PM Report Share #289798 Posted October 3, 2009 at 02:41 PM Se quiseres alterar um valor que existe fora da função que de dar à função como argumento o ponteiro. E um array é a mesma coisa que um conjunto de ponteiros. http://twitter.com/ferreira Link to comment Share on other sites More sharing options...
hristosax Posted October 3, 2009 at 02:43 PM Author Report Share #289799 Posted October 3, 2009 at 02:43 PM Se quiseres alterar um valor que existe fora da função que de dar à função como argumento o ponteiro. E um array é a mesma coisa que um conjunto de ponteiros. Não percebo o teu português. Sorry :/ Link to comment Share on other sites More sharing options...
Ferreira Posted October 3, 2009 at 02:49 PM Report Share #289800 Posted October 3, 2009 at 02:49 PM Queria dizer "tens de dar" 😄 Vou dar um exemplo. Se quiseres definir uma função que tem como argumento uma variável (e não o seu valor) e a coloca com o valor 0 usas o seguinte código: void zero(int* n) { *n = 0; } Para fazer isto precisas do ponteiro que indique qual a variável que queres alterar, porque de outra forma a única coisa a que tinhas acesso dentro da função era o valor da variável (irrelevante neste contexto). http://twitter.com/ferreira Link to comment Share on other sites More sharing options...
hristosax Posted October 3, 2009 at 02:53 PM Author Report Share #289801 Posted October 3, 2009 at 02:53 PM Queria dizer "tens de dar" 😄 Vou dar um exemplo. Se quiseres definir uma função que tem como argumento uma variável (e não o seu valor) e a coloca com o valor 0 usas o seguinte código: void zero(int* n) { *n = 0; } Para fazer isto precisas do ponteiro que indique qual a variável que queres alterar, porque de outra forma a única coisa a que tinhas acesso dentro da função era o valor da variável (irrelevante neste contexto). acho que já estou a perceber... hmmm.. Mesmo nao tendo aprendido funçoes, acho que estou a começar a perceber 🙂 Link to comment Share on other sites More sharing options...
kanixe Posted October 8, 2009 at 06:49 PM Report Share #290741 Posted October 8, 2009 at 06:49 PM um ponteiro é simplesmente uma variável que em evz de guardar um valor ou o quer que seja, guarda um endereço de uma variável. pronto é só isto lol. Link to comment Share on other sites More sharing options...
forcewill Posted October 10, 2009 at 09:49 PM Report Share #291100 Posted October 10, 2009 at 09:49 PM ponteiro é em Brasileiro, em Português diz-se apontador 😛 Como o nome indica um apontador é algo que aponta para outra coisa neste caso (programação) um apontador é uma variavel em que o seu valor é um endereço de memória para outra imagina que tens este pedaço de código char x = 50; char *pX = &x; *px = 55; agora supoe que a variavel x é colocada pelo gestor de memoria do teu os no endereço 0x00FF, o seu conteudo (valor) é posto a 50 agora imagina que o apontador px (k não é nada mais k uma variável) é colocado no endereço 0x0100 e o seu valor no exemplo acima é initializado para ser o endereço da variavel x ou seja 0x00FF. na 3º linha de código *px = 55; o * atrás da variavel px é o operador de indirecção e basicamente o operador faz isto "vê qual o valor que px contem, que é 0x00FF acede á posição de memoria 0x00FF e altera o conteudo dessa mesma posiçao para o valor 55" visuamente antes da 3º linha de código tens |----------| | 50 | 0x00FF |----------| | 0x00FF| 0x0100 |----------| PS: espero que tenha sido clara a explicação o melhor mesmo se ainda te restarem duvidas é ires a http://en.wikipedia.org/wiki/Pointer_(computing) Link to comment Share on other sites More sharing options...
hristosax Posted October 11, 2009 at 09:57 AM Author Report Share #291135 Posted October 11, 2009 at 09:57 AM ponteiro é em Brasileiro, em Português diz-se apontador 😛 Como o nome indica um apontador é algo que aponta para outra coisa neste caso (programação) um apontador é uma variavel em que o seu valor é um endereço de memória para outra imagina que tens este pedaço de código char x = 50; char *pX = &x; *px = 55; agora supoe que a variavel x é colocada pelo gestor de memoria do teu os no endereço 0x00FF, o seu conteudo (valor) é posto a 50 agora imagina que o apontador px (k não é nada mais k uma variável) é colocado no endereço 0x0100 e o seu valor no exemplo acima é initializado para ser o endereço da variavel x ou seja 0x00FF. na 3º linha de código *px = 55; o * atrás da variavel px é o operador de indirecção e basicamente o operador faz isto "vê qual o valor que px contem, que é 0x00FF acede á posição de memoria 0x00FF e altera o conteudo dessa mesma posiçao para o valor 55" visuamente antes da 3º linha de código tens |----------| | 50 | 0x00FF |----------| | 0x00FF| 0x0100 |----------| PS: espero que tenha sido clara a explicação o melhor mesmo se ainda te restarem duvidas é ires a http://en.wikipedia.org/wiki/Pointer_(computing) Eu percebo o que é, mas não percebo como USÁ-lo... Link to comment Share on other sites More sharing options...
pedrosorio Posted October 11, 2009 at 11:06 AM Report Share #291150 Posted October 11, 2009 at 11:06 AM Ponteiros são muito mais usados em C, até porque não tens a vantagem da STL e portanto tens que implementar uma série de coisas. À partida o teu programa só usa a memória que está definida em tempo de compilação. Por exemplo, se queres ter um array de inteiros, tens que definir qual o seu tamanho no código e não o podes alterar durante o programa. int numeros[100]; Imagina agora que querias ter "uma espécie de array" mas em que pudesses alterar o seu tamanho e até inserir elementos no meio do array com facilidade. Para isso terias que usar dois conceitos de C: a estrutura e a alocação de memória dinâmica. Precisavas de uma estrutura com 2 elementos: um inteiro, e um apontador para a estrutura que representa o próximo elemento. typedef struct list *lista; struct list { int num; lista seguinte; }; A isto se chama uma lista ligada. Repara que o tipo "lista" é um apontador para aquela estrutura. Para criar uma lista com um elemento que vale 30 fazes: lista l = (lista)malloc(sizeof(struct list)); //Alocar memória durante a execução do programa l -> num = 30; l -> seguinte = NULL; Em que o NULL significa que o apontador não aponta para nada (porque ainda não existe um elemento seguinte). É possível criar código para adicionar um elemento a uma lista no fim: lista acrescenta(lista ll, int n) { lista iter = ll; while( iter -> seguinte != NULL) //enquanto existir um elemento a seguir iter = iter -> seguinte; iter -> seguinte = (lista) malloc(sizeof(struct list)); // alocar memória para o novo elemento iter -> seguinte -> num = n; //colocar o número no elemento que acabámos de criar iter -> seguinte -> seguinte = NULL; //assinalar o fim da lista return ll; //Repara que devolvemos o apontador que recebemos, porque o início da lista continua a ser o mesmo } E se quisermos, por exemplo, acrescentar um elemento no início da lista? lista add_inicio(lista ll, int n) { novo = (lista) malloc(sizeof(struct list)); novo -> num = n; novo -> seguinte = ll; //O elemento que vem a seguir ao que acrescentámos é primeiro da lista que recebemos return novo; //Devolvemos o elemento criado que é agora o primeiro elemento da nova lista } De forma igualmente simples podes, por exemplo, retirar um elemento do meio da lista, bastando para isso alterar o apontador "seguinte" do elemento que está antes dele para que passe a apontar para o elemento que vem a seguir. (E cuidado que é também necessário libertar a memória do elemento que retiramos) Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Baderous Posted October 11, 2009 at 09:41 PM Report Share #291279 Posted October 11, 2009 at 09:41 PM À partida o teu programa só usa a memória que está definida em tempo de compilação. Por exemplo, se queres ter um array de inteiros, tens que definir qual o seu tamanho no código e não o podes alterar durante o programa. Em C já é possível criar arrays com um tamanho definido em run time: http://en.wikipedia.org/wiki/Variable-length_array Link to comment Share on other sites More sharing options...
pedrosorio Posted October 11, 2009 at 09:56 PM Report Share #291285 Posted October 11, 2009 at 09:56 PM Em C já é possível criar arrays com um tamanho definido em run time: http://en.wikipedia.org/wiki/Variable-length_array Sim, eu sei, e já sabia que me iam dar na cabeça por causa disso, mas for the sake of the argument fica mais bonito assim =P Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
hristosax Posted October 12, 2009 at 02:08 PM Author Report Share #291350 Posted October 12, 2009 at 02:08 PM Ponteiros são muito mais usados em C, até porque não tens a vantagem da STL e portanto tens que implementar uma série de coisas. À partida o teu programa só usa a memória que está definida em tempo de compilação. Por exemplo, se queres ter um array de inteiros, tens que definir qual o seu tamanho no código e não o podes alterar durante o programa. int numeros[100]; Imagina agora que querias ter "uma espécie de array" mas em que pudesses alterar o seu tamanho e até inserir elementos no meio do array com facilidade. Para isso terias que usar dois conceitos de C: a estrutura e a alocação de memória dinâmica. Precisavas de uma estrutura com 2 elementos: um inteiro, e um apontador para a estrutura que representa o próximo elemento. typedef struct list *lista; struct list { int num; lista seguinte; }; A isto se chama uma lista ligada. Repara que o tipo "lista" é um apontador para aquela estrutura. Para criar uma lista com um elemento que vale 30 fazes: lista l = (lista)malloc(sizeof(struct list)); //Alocar memória durante a execução do programa l -> num = 30; l -> seguinte = NULL; Em que o NULL significa que o apontador não aponta para nada (porque ainda não existe um elemento seguinte). É possível criar código para adicionar um elemento a uma lista no fim: lista acrescenta(lista ll, int n) { lista iter = ll; while( iter -> seguinte != NULL) //enquanto existir um elemento a seguir iter = iter -> seguinte; iter -> seguinte = (lista) malloc(sizeof(struct list)); // alocar memória para o novo elemento iter -> seguinte -> num = n; //colocar o número no elemento que acabámos de criar iter -> seguinte -> seguinte = NULL; //assinalar o fim da lista return ll; //Repara que devolvemos o apontador que recebemos, porque o início da lista continua a ser o mesmo } E se quisermos, por exemplo, acrescentar um elemento no início da lista? lista add_inicio(lista ll, int n) { novo = (lista) malloc(sizeof(struct list)); novo -> num = n; novo -> seguinte = ll; //O elemento que vem a seguir ao que acrescentámos é primeiro da lista que recebemos return novo; //Devolvemos o elemento criado que é agora o primeiro elemento da nova lista } De forma igualmente simples podes, por exemplo, retirar um elemento do meio da lista, bastando para isso alterar o apontador "seguinte" do elemento que está antes dele para que passe a apontar para o elemento que vem a seguir. (E cuidado que é também necessário libertar a memória do elemento que retiramos) Acontece que não percebo quase nada do que puseste, ainda não sou tão avançado. Sei o que são arrays, mas porque é que é que se tem de por um elemento com um POnteiro, e não simplesmente uma variável?! Link to comment Share on other sites More sharing options...
pedrosorio Posted October 12, 2009 at 06:35 PM Report Share #291383 Posted October 12, 2009 at 06:35 PM Vou tentar explicar sem código. Porque em C toda a memória que tu utilizas está definida à partida. Se queres acrescentar coisas a meio, tens que fazer alocação dinâmica de memória. Isso corresponde a "pedir" para que o sistema te "arranje" mais memória para o que precisas. Podes encarar a memória como sendo um array muito grande com milhões de posições. Quando pedes para arranjar um bloco de memória com um tamanho x, o sistema vai à procura de um local na memória que tenha esse espaço "vago", e devolve-te a posição onde começa esse bloco. Essa posição é um endereço de memória, que é o que fica guardado no ponteiro. Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
hristosax Posted October 12, 2009 at 07:24 PM Author Report Share #291397 Posted October 12, 2009 at 07:24 PM Vou tentar explicar sem código. Porque em C toda a memória que tu utilizas está definida à partida. Se queres acrescentar coisas a meio, tens que fazer alocação dinâmica de memória. Isso corresponde a "pedir" para que o sistema te "arranje" mais memória para o que precisas. Podes encarar a memória como sendo um array muito grande com milhões de posições. Quando pedes para arranjar um bloco de memória com um tamanho x, o sistema vai à procura de um local na memória que tenha esse espaço "vago", e devolve-te a posição onde começa esse bloco. Essa posição é um endereço de memória, que é o que fica guardado no ponteiro. Então estás a falar do apontador como sendo o Endereço de memória e não a variável que lá vai? Não percebo então porque precisas de um apontador para um lugar de uma array, se podes indicar esse lugar SOZINHO. Por exemplo, para que é que precisas de dar o nome de "Golden Spot" ao lugar de estacionamento nº12, se podes simplesmente chamá-lo de "lugar de estacionamento nº 12"? A mesma pergunta com as variáveis. Precisas de chamar ao Sr. Mota "O empresário da rua 20" se podes chama-lo de Sr mota? Eu sei que sou teimoso.. Link to comment Share on other sites More sharing options...
pedrosorio Posted October 12, 2009 at 08:23 PM Report Share #291407 Posted October 12, 2009 at 08:23 PM Há uma diferença. As variáveis que tu declaras no teu programa também têm endereços (i.e. estão numa determinada posição da memória). Os apontadores referem-se a esses endereços de memória. Sempre que precisares de te referir a alguma coisa que possa estar em locais diferentes da memória tens que usar apontadores. Para experimentar podes fazer isto: #include <stdio.h> main() { int a=10; int *apontador=&a; // &variavel, devolve o endereço de memória de uma variável printf("Valor de a: %d\n", a); printf("Endereço de a: %d\n", &a); printf("Valor do apontador: %d\n", apontador); printf("Endereço do apontador: %d\n", &apontador); printf("Valor na memória apontada pelo apontador: %d\n", *apontador); Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
hristosax Posted October 17, 2009 at 03:50 PM Author Report Share #292080 Posted October 17, 2009 at 03:50 PM Há uma diferença. As variáveis que tu declaras no teu programa também têm endereços (i.e. estão numa determinada posição da memória). Os apontadores referem-se a esses endereços de memória. Sempre que precisares de te referir a alguma coisa que possa estar em locais diferentes da memória tens que usar apontadores. Para experimentar podes fazer isto: #include <stdio.h> main() { int a=10; int *apontador=&a; // &variavel, devolve o endereço de memória de uma variável printf("Valor de a: %d\n", a); printf("Endereço de a: %d\n", &a); printf("Valor do apontador: %d\n", apontador); printf("Endereço do apontador: %d\n", &apontador); printf("Valor na memória apontada pelo apontador: %d\n", *apontador); Ahh então estás a dizer que eu me posso usar o ponteiro para mudar ESSE endereço de memória, e que não posso fazer isso com a variável? Então o ponteiro dá-me o poder de mudar o endereço de memória de int a, em vez de só ter acesso à variável? Mas para que é que eu precisaria disso ? 😛 Link to comment Share on other sites More sharing options...
Ferreira Posted October 17, 2009 at 03:54 PM Report Share #292081 Posted October 17, 2009 at 03:54 PM Por exemplo, se quiseres definir que duas variáveis se referem ao mesmo valor (e não a valores iguais). http://twitter.com/ferreira Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now