Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

VictorCacciari

[Tutorial] Pointers

Recommended Posts

Boas pessoal!!

Eu vejo bastante gente com dúvidas em ponteiros, e como usá-los!

É um recurso MUITO poderoso que C/C++ nos fornece, mas que deixa qualquer iniciante de cabelos em pé!!

Vou tentar vos ensinar um pouco sobre ponteiros.

 

Então vamos lá,

peguem nos vossos compiladores, editores de texto e mãos a obra!!

 

--> O que são ponteiros?

 

Para entender o conceito, vamos imaginar a memória do nosso computador como uma sucessão de pequenos blocos de um tamanho mínimo (1 byte). Esses blocos são numerados de forma consecutiva.

Então, se estivermos a olhar para o bloco 1776, sabemos que mil blocos a frente estará o bloco 2776, exatamente.

 

Sempre que declaramos uma variável, a quantidade necessária de memória é alocada, em um local específico da memória (endereço de memória). Normalmente não somos nós (programadores) que escolhemos onde cada variável será alocada, ainda bem! É o sistema operacional que faz isso "on-the-fly". E em alguns casos é interessante sabermos onde "está" a nossa variável, isto é, sabermos o seu endereço de memória.

 

--> O operador '&'

 

'&' é um operador de referência.

num trecho de código:

a = &b;

Estamos passando o endereço de "b" para "a".

Neste exato momento, "a" sabe onde "b" está, mas não sabe o valor de "b".

 

#include <stdlib.h>
#include <stdio.h>

int main()
{
unsigned int joao;

	joao = 10;
	
	printf("João está em: %x na memória\n", &joao);
	
	return 0;
}

--> O operador '*'

 

O operador '*' (não confundir com multiplicação!!!!!!!!!!) faz exatamente o contrário de '&'.

Quando fazemos:

a = *b;

Extamos dizendo: "Passe para 'a' o valor que estiver no endereço de memória 'b'".

Então:

joao = 10;
carlos = &joao;
pedro = *carlos;

Qual o valor de "carlos"??

é 10!!

Olhem só:

"carlos" pede o endereço de "joao" e "pedro" pede o valor que está no endereço "carlos".

 

--> Declarando Ponteiros

 

O operador '*' também serve para declararmos variáveis que serão ponteiros!

int* a;

"a" não será um inteiro, mas sim um ponteiro para um inteiro

 

As seguintes declarações são corretas:

int* a;
int *a;
int * a;

 

Ok, chega de teoria!!

#include <stdlib.h>
#include <stdio.h>

int main()
{
int joao, carlos;
int *joao_p, *carlos_p;

	joao = 10;
	carlos = 20;
	
	joao_p = &joao;
	carlos_p = &carlos; 
	
	printf("Joao: %d\n", joao);
	printf("Carlos: %d\n", carlos);
	
	printf("Joao esta em: %x\n", joao_p);
	printf("Carlos esta em: %x\n", carlos_p);
	
	(*carlos_p) = 100;
	
	printf("Joao: %d\n", joao);
	printf("Carlos: %d\n", carlos);
	
	
	return 0;
}

É interessante que você "brinque" com esse código, para compreender bem os conceitos apresentados acima, para que possamos continuar!!

 

--> Passagem por referência em funções ( C )

 

#include <stdlib.h>
#include <stdio.h>

void adicionar(int a, int b)
{
	a = a+b;
}

int main()
{
int valor1, valor2;

	valor1 = 10;
	valor2 = 14;
	
	adicionar(valor1, valor2);
	
	//façam as apostas!! qual o valor de "valor1"???
	printf("Valor1 = %d\n", valor1);
	printf("Valor2 = %d\n", valor2);  
	
	return 0;
}

O que aconteceu com esse código??

Se comportou de forma "estranha" não foi?

 

Na verdade não...

O que acontece é que ao chamarmos a função:

adicionar(valor1, valor2);

A função copia os valores de "valor1" e "valor2" para usar. Qualquer alteração feita será apenas aplicada nessas copias.

 

E se quisermos realmente mudarmos o valor das variáveis??

PONTEIROS

 

Vamos então passar o endereço das variáveis para a função:

#include <stdlib.h>
#include <stdio.h>

void adicionar(int* a, int* b)
{
	(*a) = (*a)+(*b);
	//nota: Pegue o valor que está no endereço "a", some com o que está no endereço "b"
}

int main()
{
int valor1, valor2;

	valor1 = 10;
	valor2 = 14;
	
	//A função pede endereços de memória, é aqui que entra o operador '&'
	adicionar(&valor1, &valor2);
	
	//façam as apostas!! e agora? qual o valor de "valor1"???
	printf("Valor1 = %d\n", valor1);
	printf("Valor2 = %d\n", valor2);  
	
	return 0;
}

--> Obrigado

 

Pois é, por enquanto é só.

Escrevi pouca coisa, foi só uma introdução para o assunto que eu realmente quero abordar: Aritmética com ponteiros.

 

Se tiverem dúvidas, postem a vontade!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou fazer um pequeno resumo do que entendi ok? e você me diga se estou certo ou errado corrigindo cada ideia numerada.

 

1- basicamente para criar um ponteiro eu uso (*)

 

2- quando eu crio um ponteiro eu reservo um espaço, endereço fixo, onde posso guardar determinados valores nesse ponteiro

 

3- sobre os operadores -> & , * <- onde ( a= &/*b ) se eu utilizar "&" transfiro o endereço de b para a.

se utilizar "*" transfiro o valor de b para o endereço a.

 

 

4- esse foi o conceito q você quis nos passar?

 

algumas coisas q você usou no seu codigo ainda nao compreendo perfeitamente tipo

void adicionar(int* a, int* B)
{
        (*a) = (*a)+(*B);
        //nota: Pegue o valor que está no endereço "a", some com o que está no endereço "b"
}

você usa void adicionar antes do int main, como estou nas primeiras aulas de C ainda n compreendo.. mas mt obrigado seu post foi mt didatico

 

obrigado

att Lucas Konrath

Compartilhar este post


Link para o post
Compartilhar em outros sites
2- quando eu crio um ponteiro eu reservo um espaço, endereço fixo, onde posso guardar determinados valores nesse ponteiro

Depende do que você considera 'criar um ponteiro'. Declarar um ponteiro não reserva espaço em memória. Isso deve ser feito explicitamente usando malloc.

você usa void adicionar antes do int main

?? Isso é uma função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao.. sou iniciante em linguagem C.. mt coisa q eh basico para vcs eu ainda n compreendo.. por exemplo

 

malloc - ainda n sei o q quer dizer

void adicionar - tb nao entendo no momento

 

sao conceitos que tenho q pegar..

 

hj a noite tenho aula dessa linguagem .. vou exclarecer duvidas.. faz pouco tempo q começei a estudar e estou tentando me adiantar na disciplina por isso encontro um pouco de dificuldade sozinho e resolvi procurar o forum

 

obrigado

att Lucas K

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.