Estudo de ponteiros para GNU/Linux

Esse artigo é um aprofundamento no estudo sobre ponteiros em C/C++. Aqui serão tratados conceitos de ponteiros de forma teórica e prática ao mesmo tempo, o que torna o texto uma leitura agradável para os interessados no assunto.

[ Hits: 34.912 ]

Por: Wesley Oliveira em 08/10/2004


Operadores de ponteiros



Temos dois operadores de ponteiro. O primeiro é o * (favor, não confundir com o operador aritmético de multiplicação) que é utilizado para declarar uma variável do tipo ponteiro, exemplo:

int numero;
int *ptrnumero;   # este aqui é um ponteiro.

O segundo operador é o & (não confundir com o AND bit-a-bit), este informa o endereço de uma variável, exemplo:

int numero;
int *ptrnumero;

ptrnumero = №

Não se deve adicionar um endereço a um ponteiro desreferenciado (com o * antes do nome da variável ponteiro), pois o valor do ponteiro será o endereço da variável que você adicionou. Dessa forma, você não poderá acessar o valor da variável através do ponteiro, pois ele desreferenciado terá somente o endereço da memória.

Os operadores de ponteiros se complementam entre si, exemplo: *&ptrnumero ou &*ptrnumero é igual a ptrnumero, ou seja, está retornando o endereço da variável para o qual está apontando. Desreferenciar um ponteiro é fazer com que ele devolva o conteúdo dele. E & fará com que ele retorne seu próprio endereço.

Código exemplo:

/* Exemplo de código do Estudo de Ponteiros para GNU/Linux
* Desenvolvido por Wesley Oliveira
* Copyright(C) 2004, Wesley Oliveira
*/

#include <stdio.h>

int main(void)
{
  int numero;
  int *ptrnumero;

  numero=5;
  ptrnumero= №

  printf("\n*ptrnumero = %p\nnumero = %d\n",*ptrnumero,numero);
  printf("O endereco de numero: %p\n",&numero);
  printf("O endereco de numero = %p\n",&*ptrnumero);
  printf("O endereco de ptrnumero: %p",&ptrnumero);

  return 0;
}
Página anterior     Próxima página

Páginas do artigo
   1. Estudo de ponteiros para GNU/Linux
   2. Operadores de ponteiros
   3. Operações com ponteiros
   4. Apontadores em argumentos de funções
   5. Indireção múltipla ou vetores de apontadores
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Criando uma calculadora com o KDevelop

Introdução à linguagem C - Parte I

Introdução à linguagem C - Parte III

Utilizando a função QSort em C

Operadores com a linguagem C

  
Comentários
[1] Comentário enviado por cvs em 08/10/2004 - 09:35h

Muito bom, sempre tive dificuldades com ponteiros e nunca achava algo que fosse interessante de ler e o professor da faculdade ainda só enrolava :D

[2] Comentário enviado por Jarnotrulli em 09/10/2004 - 03:23h

So um pequeno comentario em C.
Na linguagem C++ e possivel chamar variaveis com referencia( por exemlo, void soma(int x, int y, int& resultado)).
Em C so ha chamadas por valor. Este e um truque que transforma chamadas por copia em chamadas por referencia.
Alias,o artigo esta otimo! A nao ser pelo titulo. Ponteiros tambem funcionam no meu MenuetOS, e nao so no GNU/Linux...

[3] Comentário enviado por jllucca em 10/10/2004 - 20:50h

Jarnotrulli,

no proprio artigo é mostrado como C pode trabalhar por passagem por referencia(soma(int x, int y, int* resultado)). Mas, o truque do "&" que voce demostra só existe no C++ e se não me engano é chamado de "ponteiro mascarado" ou "mascaramento de ponteiro".

O artigo tá excelente e também não gostei do nome do titulo pq programação é baseada em conceitos e não nos sistemas operacionais...

[]'s

[4] Comentário enviado por Jarnotrulli em 12/10/2004 - 17:02h

Vou explicar melhor: em C, nao existe uma chamada por valor pronta (ou seja, voce tem que fazer uma), mas em C++ existe (mas ainda da para fazer no estilo C, apesar de programadores C++ nao gostarem muito...).
O truque ao qual eu me referia era o que o artigo expoe. So isso!

espero ter ajudado...
Ass.:Johann

[5] Comentário enviado por powerlinux em 12/10/2004 - 20:09h

Acho que você está enganado Johann, em C e C++ todas as chamadas são por valor, exceto as que passam endereços (vetores etc.), aí sim, são todas por referência. Todas as estruturas de dados que por natureza são passadas nos argumentos apenas o endereço, essas são por referência as outras todas são por valor.

Uma forma de se passar endereços por valor é da forma como expliquei no tutorial, colocando o qualificador const antes da declaração do argumento.

Quanto ao título, apenas quiz criticar alguns tutoriais que existem na internet onde se trata de padrões (ANSI, ISO) e os autores colocam títulos como: estudo de ponteiros para Windows ou outra coisa do tipo.

[6] Comentário enviado por Jarnotrulli em 13/10/2004 - 02:17h

Eu vou reexplicar (afinal, isso e sobre eu e voce ou sobre o artigo? :-) )

Em C, voce faz algo como:

void trocardelugar(int *a, int *b){

/*Inserir codigo aqui!*/
}

int main (void){
/*escreva algum codigo que use isso!*/
troca(&a,&b);/*Nao esquecer do & antes do argumento!*/
return 0;
}

A rigor, em C nao ha chamdas por valor. Voce e obrigado a passar apontadores para mudar os parametros dentro da funçao e isso acontecer do lado de fora.

Em C++ isso nao e necessario. Voce faz isso aqui:


void trocardelugar(int& a, int& b){

//Inserir codigo aqui!
}

int main (void){
//escreva algum codigo que use isso!
troca(a,b);
return 0;
}

Bem, em C++ nao e necessario passar o endereço na hora de usar a chamada por referencia (bem, se o compilador implementa isso como uma chamada de valores com ponteiros, ou qualquer coisa parecida, nao interessa pois estou falando em alto-nivel).

Sera que fui claro?
Em C, se passa o endereço por valor para obter uma chamada por referencia.
Em C++, se passa por referencia direto,sem rodeios!

Um outro exemp-lo e o var do Pascal, para quem conhece.
Estou pensando num artigo sobre isso.
Ate mais!

[7] Comentário enviado por Jarnotrulli em 13/10/2004 - 02:23h

Eu vou reexplicar (afinal, isso e sobre eu e voce ou sobre o artigo? :-) )

Em C, voce faz algo como:

void trocardelugar(int *a, int *b){

/*Inserir codigo aqui!*/
}

int main (void){
/*escreva algum codigo que use isso!*/
troca(&a,&b);/*Nao esquecer do & antes do argumento!*/
return 0;
}

A rigor, em C nao ha chamdas por valor. Voce e obrigado a passar apontadores para mudar os parametros dentro da funçao e isso acontecer do lado de fora.

Em C++ isso nao e necessario. Voce faz isso aqui:

void trocardelugar(int& a, int& b){

//Inserir codigo aqui!
}

int main (void){
//escreva algum codigo que use isso!

troca(a,b);
return 0;
}

Bem, em C++ nao e necessario passar o endereço na hora de usar a chamada por referencia (bem, se o compilador implementa isso como uma chamada de valores com ponteiros, ou qualquer coisa parecida, nao interessa pois estou falando em alto-nivel. E disto que eu estou falando, capiche?).

Sera que fui claro?
Em C, se passa o endereço por valor para obter uma chamada por referencia.
Em C++, se passa por referencia direto,sem rodeios!

Um outro exemp-lo e o var do Pascal, para quem conhece.
Estou pensando num artigo sobre isso.
Ate mais!

[8] Comentário enviado por powerlinux em 13/10/2004 - 16:24h

Johann não é nada sobre eu e você. Eu não tenho nada contra você até testei o que você me explicou e funcionou, achei ótimo. Mas você se esquece que o foco é tão somente C (se bem que não tá bem explicado no tutorial, não é? dou a todos os créditos das críticas sobre isso). O fato de C++ suportar o que estou explicando no tutorial é que C++ é um complemento de C.

Outra coisa, o que você explicou só é possível porquê C++ compatibiliza os tipos, e o compilador se incumbe de passar o endereço dos parâmetros para a função receptora. Mas não deixa de ter seus méritos o fato de C++ possibilitar isso... facilita muito a vida do programador.
Agora não diga que: "... em C nao ha chamdas por valor.." pois todas as passagens de parâmetros em C são por valor, exceto as que coloquei no comentário acima.

Mais uma vez, nada pessoa, só quero que os leitores não sintam inseguros de aplicar o que lhes mostrei no tutorial. Caso alguém queira contribuir com sujestões e críticas fiquem a vontade de enviar para o meu e-mail. E para tornar as coisas mais claras, informo que estou refazendo o tutorial e ampliando alguns tópicos e vou disponibilizá-lo novamente. Agora não sei se será aqui no VOL ou se será no meu site pessoal. Até, se o Fábio estiver lendo isso, quero saber como faço para lançar a versão 2 do tutorial no VOL?

Obrigado.

[9] Comentário enviado por f_Candido em 10/09/2007 - 21:51h

Muito bom seu Artigo. Parabéns.
Abraços

[10] Comentário enviado por sachetto em 11/12/2009 - 10:41h

Cara achei seu artigo muito bom. só no final dele que eu nao consegui intender o lance da variavel "char"
char *ptrVetor[10];
aqui foi que eu me embolei.

mesmo assim muito obrigado

[11] Comentário enviado por thiagomiranda3 em 02/03/2013 - 01:35h

Muito obrigado pelo artigo amigo. Ajudou bastante.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts