Вы находитесь на странице: 1из 17

Linguagem de Programação C/C++

19/10/15

Advertisement Siga-nos no Twitter FEED RSS - O que é isso? Adicione aos Favoritos Buscar
Advertisement
Siga-nos no Twitter
FEED RSS - O que é isso?
Adicione aos Favoritos
Buscar
BLOG
FÓRUM
SITEMAP
QUEM SOMOS
CONTATO
Programação
TI Expert » Programação » C/C++
Enquete
› Algoritmo
C/C++
› C/C++
O Google Chrome OS
irá desbancar o
Microsoft Windows 7?
› Java
Linguagem de programação criada na década de 70. Ainda situa-se como uma das linguagens de
programação mais largamente utilizada no mundo.
sim
Web
não
Tutorial completo
+ Novidades
› HTML/XHTML
parciais
votar
Ponteiros Nulos e Vazios
› JavaScript
Introdução - C
(Null Pointers e Void Pointers)
Introdução C++
› PHP
Ponteiros para Ponteiros
O que é Necessário para Programar em C ou C++
Primeiro Programa em C
Analisando o Primeiro Programa em C
Sistema Operacional
Ponteiro Como Argumento
de Função
Ponteiro de Vetor
› Comandos de DOS
Include e as Bibliotecas
Ponteiros de Struct
Declaração de Variáveis
› Windows
Processos e Atribuição de Valor a Variáveis
› Linux
Funções de Saída em C
+ Os mais lidos
Tudo Sobre Máscaras de Dados
› Mac/BSD
Switch, Case e Default
Office
Funções de Saída em C++
Funções de Entrada em C
Estrutura de Repetição - FOR
Funções de Entrada em C++
› Word / Writer
Usando Comandos de Sistema MS-DOS
Estrutura Seletiva - IF e
ELSE
Estrutura Seletiva - IF e ELSE
› Excel / Calc
Estrutura de Repetição -
WHILE
Áreas do Site
Operadores Lógicos
Estrutura de Repetição - FOR
Biblioteca Matemática
Estrutura de Repetição - WHILE
(Math.h)
› Download
Estrutura de Repetição - DO WHILE
› Fórum
Funções
Funções (com argumentos)
› Blog
Parcerias
Recomendamos
Anúncios Google
Variáveis Locais e Globais
Protótipos de Funções
Recursividade
Funções Inline
Comandos BREAK e CONTINUE
Switch, Case e Default
Labels e GOTO
Trabalhando com Caracteres, a biblioteca CTYPE
► C++ tutorial
Vetores Unidimensionais
String
► Programa c++
#define (Definir constantes)
Typecast (Conversão de Tipos de Dados)
► C c++
Biblioteca Matemática (Math.h)
Estrutura de Dados - STRUCT
Typedef - Definição de Nomes de Tipos
Ponteiros, referência e dereferência
Ponteiros de Struct
Ponteiro de Vetor
Ponteiro Como Argumento de Função
Ponteiros para Ponteiros
Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)
» Programação › Algorítmo | C/C++ | Java
» Quem Somos
» Web › HTML/XHTML | JavaScript | PHP
» Contato
» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD
» Termos de Uso
» Office › Word/Wirter | Excel/Calc
WWW.TIEXPERT.NET © 2007 - 2010
» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Estrutura de Dados - STRUCT

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP

Programação

› Algoritmo

› C/C++

› Java

Web

› HTML/XHTML

› JavaScript

› PHP

Sistema Operacional

› Comandos de DOS

› Windows

› Linux

› Mac/BSD

Office

› Word / Writer

› Excel / Calc

Áreas do Site

› Download

› Fórum

› Blog

Parcerias

Recomendamos

Anúncios Google ► C c++ c# ► Programa c++ ► Struct c++
Anúncios Google
C c++ c#
Programa c++
Struct c++

»

»

»

»

Office › Word/Wirter | Excel/Calc

MESTRADO E DOUTORADO INTERNACIONAL inscrições abertas - INICIO JANEIRO INSCRIBA-SE 2016
MESTRADO E DOUTORADO
INTERNACIONAL
inscrições abertas - INICIO JANEIRO
INSCRIBA-SE
2016

BLOG

FÓRUM

SITEMAP

QUEM SOMOS

CONTATO

TI Expert » Programação » C/C++ » Estrutura de Dados - STRUCT

Estrutura de Dados - STRUCT

O conceito de orientação a objeto - principalmente classes que serão tratadas mais a frente -

tem uma base muito sólida no conceito de estrutura de dados.

As estruturas de dados consistem em criar apenas um dado que contém vários membros, que nada mais são do que outras variáveis. De uma forma mais simples, é como se uma variável

tivesse outras variáveis dentro dela. A vantagem em se usar estruturas de dados é que podemos

agrupar de forma organizada vários tipos de dados diferentes, por exemplo, dentro de uma

estrutura de dados podemos ter juntos tanto um tipo float, um inteiro, um char ou um double.

As variáveis que ficam dentro da estrutura de dados são chamadas de membros.

Criando uma estrutura de dados com STRUCT

Para criar uma estrutura de dados usamos a palavra reservada struct. Toda estrutura deve ser

criada antes de qualquer função ou mesmo da função principal main. Toda estrutura tem nome e

seus membros são declarados dentro de um bloco de dados. Após a definição de seus membros

no bloco de dados, terminamos a linha com um ponto-e-vírgula (;). Portanto:

1.

struct nome_da_estrutura { tipo_de_dado nome_do_membro; };

Por exemplo, se fossemos criar uma estrutura de dados para simbolar uma data faríamos:

1.

struct data {

2.

int dia;

3.

int mes;

4.

int ano;

5.

};

Declarando um struct e acessando seus membros

Ainda utilizando o exemplo acima, vamos declarar uma variável do tipo estrututa de dados data e acessar seus membros.

Após criarmos uma estrutura de dados com struct, poderemos utilizá-la como um tipo de dado comum (ex.: float, int, char). E para acessar seus membros utilizamos a variável declarada mais um ponto (.) e o nome do membro. Veja este exemplo abaixo:

01.

#include <iostream>

02.

#include <cstdlib>

03.

using namespace std;

04.

 

05.

struct data {

06.

int dia;

07.

int mes;

08.

int ano;

09.

};

10.

 

11.

int main (void){

12.

data hoje;

13.

hoje.dia = 23;

14.

hoje.mes = 9;

15.

hoje.ano = 2008;

16.

cout <<"Hoje e "<<hoje.dia<<"/"<<hoje.mes<<"/"<<hoje.ano<<endl;

17.

system ("pause");

18.

return EXIT_SUCCESS;

19.

}

Portanto, a variável hoje é declarada como sendo um tipo de dado data. Data é uma estrutura de dados que tem três características (ou três membros) inteiros: dia, mes e ano. Como hoje é um tipo de dado data, ele obtém os mesmos três membros. Para acessar cada membro, usamos a variável e depois o nome do membro que queremos acessar separados por ponto (.).

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons.

‹ Biblioteca Matemática (Math.h)

C/C++

Creative Commons . ‹ Biblioteca Matemática (Math.h) C/C++ Gostou? Indique nosso site! Páginas Relacionadas C/C++ -
Creative Commons . ‹ Biblioteca Matemática (Math.h) C/C++ Gostou? Indique nosso site! Páginas Relacionadas C/C++ -

Gostou?

Indique nosso site!

Páginas Relacionadas

C/C++ - Declaração de Variáveis

Typedef - Definição de Nomes de Tipos ›

Este artigo foi lido 131687 vezes

de Nomes de Tipos › Este artigo foi lido 131687 vezes C/C++ - Typedef - Definição

C/C++ - Typedef - Definição de Nomes de Tipos

C/C++ - Ponteiros de Struct

C/C++ - Tudo Sobre Máscaras de Dados

C/C++ - Typecast (Conversão de Tipos de Dados)

Java - Get e Set - Métodos Acessores

Java - Public, Private e Protected

Java - O que são Atributos e Variáveis

Java - Tipos de Dados

Java - Enum

Buscar
Buscar

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar
o Microsoft Windows 7? sim não parciais votar » Quem Somos » Contato » Termos de

» Quem Somos

» Contato

» Termos de Uso

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

no Twitter FEED RSS - O que é isso? Adicione aos Favoritos Programação › Algorítmo |

Programação › Algorítmo | C/C++ | Java

Web › HTML/XHTML | JavaScript | PHP

Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

WWW.TIEXPERT.NET © 2007 - 2010

C/C++ - Estrutura de Dados - STRUCT

19/10/15

» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Typedef - Definição de Nomes de Tipos

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP

Programação

› Algoritmo

› C/C++

› Java

Web

› HTML/XHTML

› JavaScript

› PHP

Sistema Operacional › Comandos de DOS › Windows › Linux › Mac/BSD Office › Word
Sistema Operacional
› Comandos de DOS
› Windows
› Linux
› Mac/BSD
Office
› Word / Writer
› Excel / Calc
Áreas do Site
› Download
› Fórum
› Blog
Parcerias
Recomendamos
Anúncios Google ► Dev c++ ► C c++ ► Java c++
Anúncios Google
Dev c++
C c++
Java c++
Anúncios Google ► Dev c++ ► C c++ ► Java c++ DESKTOPS PARA EMPRESAS FÓRUM SITEMAP
Anúncios Google ► Dev c++ ► C c++ ► Java c++ DESKTOPS PARA EMPRESAS FÓRUM SITEMAP
Anúncios Google ► Dev c++ ► C c++ ► Java c++ DESKTOPS PARA EMPRESAS FÓRUM SITEMAP
Anúncios Google ► Dev c++ ► C c++ ► Java c++ DESKTOPS PARA EMPRESAS FÓRUM SITEMAP

DESKTOPS PARA EMPRESAS

FÓRUM

SITEMAP

QUEM SOMOS

DESKTOPS PARA EMPRESAS FÓRUM SITEMAP QUEM SOMOS CONTATO

CONTATO

BLOG

Buscar
Buscar

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar
o Microsoft Windows 7? sim não parciais votar Inspiron Small (Intel®). Desempenho Rápido c/ Intel®
o Microsoft Windows 7? sim não parciais votar Inspiron Small (Intel®). Desempenho Rápido c/ Intel®
o Microsoft Windows 7? sim não parciais votar Inspiron Small (Intel®). Desempenho Rápido c/ Intel®
o Microsoft Windows 7? sim não parciais votar Inspiron Small (Intel®). Desempenho Rápido c/ Intel®
o Microsoft Windows 7? sim não parciais votar Inspiron Small (Intel®). Desempenho Rápido c/ Intel®

Inspiron Small (Intel®). Desempenho Rápido c/ Intel® Co…

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

no Twitter FEED RSS - O que é isso? Adicione aos Favoritos TI Expert » Programação

TI Expert » Programação » C/C++ » Typedef - Definição de Nomes de Tipos

Typedef

Em C e C++ podemos redefinir um tipo de dado dando-lhe um novo nome.

Essa forma de programação ajuda em dois sentidos: 1º. Fica mais simples entender para que serve tal tipo de dado; 2º. É a única forma de conseguirmos referenciar uma estrutura de dados dentro de outra (struct dentro de struct).

Para redefinirmos o nome de um tipo de dado usamos o comando typedef, que provém de type

definition.

Typedef faz o compilador assumir que o novo nome é um certo tipo de dado,
Typedef faz o compilador assumir que o novo nome é um certo tipo de dado, e então, passamos
a usar o novo nome da mesma forma que usaríamos o antigo.
Por exemplo, podemos definir que, ao invés de usarmos int, agora usaremos inteiro ou, ao invés
de usarmos float, usaremos decimal.
Typedef deve sempre vir antes de qualquer programação que envolva procedimentos (protótipo
de funções, funções, função main, structs, etc.) e sua sintase base é:
typedef nome_antigo nome novo;
Dessa forma, simplesmente, definiríamos o exemplo acima como:
1.
typedef int inteiro;
2.
typedef float decimal;
Se fossemos utilizar essas novas definições em um programa ficaria assim:
01.
#include <iostream>
02.
#include <cstdlib>
03.
using namespace std;
04.
05.
typedef int inteiro;
06.
typedef float decimal;
07.
08.
int main (){
09.
inteiro x = 1;
10.
decimal y = 1.5;
11.
cout << "X=" << x << "\nY=" << y << endl;
12.
system ("pause");
13.
return EXIT_SUCCESS;
14.
}
Nota importante: O uso de typedef para redefinir nomes de tipos primitivos (como int, float,
char) é altamente desencorajado por proporcionar uma menor legibilidade do código. Portanto,
devemos utilizar typedef apenas em momentos oportunos (como por exemplo, definir o nome de
uma estrutura de dados complexa - struct).
Definindo nomes para estruturas de dados
Uma vantagem muito grande que typedef nos proporciona é definir um nome para nossa
estrutura de dados (struct).
Graças a isso, somos capazes de auto-referenciar a estrutura, ou seja, colocar um tipo de dado
struct dentro de outro struct.
Podemos definir o nome de uma estrutura de dados (struct) de duas maneiras:
Definindo o nome da estrutura e só depois definir a estrutura; ou definir a estrutura ao mesmo
tempo que define o nome.
Da primeira forma seria o mesmo que fizéssemos isso:
1.
typedef struct estrutura1 MinhaEstrutura;
2.
struct estrutura1 {
3.
int var1;
4.
float var2;
5.
};
Da segunda forma seria o mesmo que fizéssemos isso:
1.
typedef struct estrutura1 {
2.
int var1;
3.
float var2;
4.
} MinhaEstrutura;
Agora, que já possuímos uma estrutura de dados definida com um nome, nós podemos utilizá-la
dentro de outra estrutura de dados. Por exemplo:
01.
typedef struct estrutura1 MinhaEstrutura;
02.
struct estrutura1 {
03.
int var1;
04.
float var2;
05.
};
06.
07.
struct estrutura2 {
08.
int var3;
09.
MinhaEstrutura var4;
10.
};
Como podemos perceber, somos capazes de usar MinhaEstrutura (que na verdade é o struct
estrutura1) dentro do struct estrutura2 perfeitamente, sem maiores problemas. O que seria
impossível de ser feito se declarássemos dentro de estrutura2 o var4 como sendo estrutura1.
Para demonstrar com algo mais concreto, abaixo está um algoritmo que obtém a data de
nascimento de uma pessoa.

01.

02.

03.

04.

05.

06.

07.

08.

#include <iostream>

#include <cstdlib>

#include <cstring>

using namespace std;

typedef struct data {

unsigned short dia;

unsigned short mes;

C/C++ - Typedef - Definição de Nomes de Tipos

19/10/15

» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.
» » » » Office › Word/Wirter | Excel/Calc » 09. 10. 11. 12. 13.

»

»

»

»

Office › Word/Wirter | Excel/Calc

»

09.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

unsigned int ano;

} Data;

typedef struct aniversario {

char nome[50];

Data nascimento;

} Aniversario;

int main (){

Aniversario alguem;

cout << "Digite o nome de alguem" << endl;

cin.getline (alguem.nome, 50);

cout << "Digite o dia que esta pessoa nasceu" << endl;

cin >> alguem.nascimento.dia;

cout << "Digite o mes que esta pessoa nasceu" << endl;

cin >> alguem.nascimento.mes;

cout << "Digite o ano que esta pessoa nasceu" << endl;

cin >> alguem.nascimento.ano;

system ("cls");

cout << alguem.nome << endl;

cout << "nasceu em ";

cout << alguem.nascimento.dia<<"/";

cout << alguem.nascimento.mes<<"/";

cout << alguem.nascimento.ano<<endl;

system ("pause");

return EXIT_SUCCESS;

}

system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso
system ( "pause" ); return EXIT_SUCCESS; } » Quem Somos » Contato » Termos de Uso

» Quem Somos

» Contato

» Termos de Uso

Faça o Download deste Código No algoritmo acima, obtemos o nome da pessoa dentro de
Faça o Download deste Código
No algoritmo acima, obtemos o nome da pessoa dentro de uma string na struct aniversario, e
dentro desta estrutura também há outra struct que define os dados contidos em qualquer data
(dia, mês e ano). Então, declaramos uma variável chamada alguem do tipo aniversario (que é na
verdade o struct aniversario). Pegamos uma string e guardamos dentro do membro nome. As
datas são acessadas da mesma forma, mas com um detalhe. Como alguem possui outro struct
declarado dentro dele com o nome de nascimento, devemos primeiro acessar a variável
nascimento para só depois acessar o membro de sua estrutura. Esse conceito é importante
entender, porque podem existir muitas estruturas aninhadas e para acessar um determinado tipo
de dado devemos percorrer toda estrutura. É como se estivéssemos entrando em várias pastas
diferentes até chegar ao arquivo que queremos e, ao invés, de separar cada estrutura com uma
barra (como acontece com as pastas), nós separamos cada estrutura com um ponto.
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.
‹ Estrutura de Dados - STRUCT
C/C++
Ponteiros, referência e dereferência ›
Gostou?
Indique nosso site!
Este artigo foi
lido 87694 vezes
Páginas Relacionadas
C/C++ - Estrutura de Dados - STRUCT
C/C++ - Ponteiros de Struct
Java - Enum

Programação › Algorítmo | C/C++ | Java

Web › HTML/XHTML | JavaScript | PHP

Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

WWW.TIEXPERT.NET © 2007 - 2010

Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiros, referência e dereferência

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP

Programação

› Algoritmo

› C/C++

› Java

Web

› HTML/XHTML

› JavaScript

› PHP

Sistema Operacional

› Comandos de DOS

› Windows

› Linux

› Mac/BSD

Office

› Word / Writer

› Excel / Calc

Áreas do Site

› Download

› Fórum

› Blog

Parcerias

Recomendamos

Anúncios Google ► C++ ► Programacao ► Java to c++
Anúncios Google
C++
Programacao
Java to c++

BLOG

FÓRUM

SITEMAP

QUEM SOMOS

CONTATO

BLOG FÓRUM SITEMAP QUEM SOMOS CONTATO TI Expert » Programação » C/C++ » Ponteiros, referência e

TI Expert » Programação » C/C++ » Ponteiros, referência e dereferência

Ponteiros

Ponteiros são as mais poderosas e também as mais controversas ferramentas da linguagem C e

C++.

Ponteiros foram abolidos de linguagens novas baseadas em C, como por exemplo Java. Mas, um

programa que utiliza ponteiros sabiamente tem um desempenho muito maior, pois ponteiros

trabalham diretamente com a memória. Dessa forma, praticamente, podemos manipular toda a

quantia de memória do computador, mesmo que seja pouca ou muita.

Ponteiros como o próprio nome diz, é quem aponta. Sua única função, mas de extrema

importância, é guardar o endereço de memória de uma variável.

Quando declaramos uma variável e executamos o programa, o sistema operacional se encarrega

de alocar (reservar) o espaço necessário para o tipo de dado e "marca" aquele espaço de

memória com um nome, que é o nome da variável. O papel do ponteiro é guardar exatamente

este endereço.

Como ponteiros guardam endereços de memória, podemos guardar o endereço de qualquer

parte da memória, mesmo que este espaço não tenha sido reservado no início da execução do programa.

Podemos declarar ponteiros ou usar referenciamento e dereferenciamento. Ponteiros são

declarados como se fossem variáveis, mas contendo um indicador (que é um asterisco).

Por exemplo, se formos criar dois ponteiros, sendo um para um endereço de memória contendo um dado float e outro contendo um int, faríamos:

1.

float *ponteiroFloat

2.

int *ponteiroInt

Pronto, agora já temos nossos ponteiros criados. Agora, vamos ver realmente como eles

funcionam.

Referência

Referência é quando nos referimos diretamente ao identificador do endereço da memória.

A memória é na verdade uma grande tabela com células sequenciais, cada célula tem seu próprio

endereço que segue um padrão contínuo. Ou seja, a primeira célula será 0x00000000, a segunda

0x00000001, a terceira 0x00000002, e assim por diante.

Quando fazemos referência, estamos obtendo exatamente este valor, que é o endereço da célula na memória.

A referência é dada pelo operador &.

Então, vamos imaginar que temos uma variável inteira chamada var1 que vale 100. Iremos criar um ponteiro chamado ptr1 que irá obter o endereço de memória onde está var1.

01.

#include <iostream>

02.

#include <cstdlib>

03.

using namespace std;

04.

 

05.

int main (){

06.

int var1 = 100;

07.

int *ptr1;

08.

ptr1 = &var1;

09.

cout << ptr1 << endl;

10.

system ("pause");

11.

}

Perceba que aqui nós atribuímos a ptr1 o endereço de memória de var1 (&var1) e não o valor contido em var1.

Portanto, o valor de ptr1 não será 100, mas um endereço de memória 0x "algum hexadecimal". Pois é impossível saber qual será o endereço de uma variável antes da execução do programa.

Dereferência

Dereferência é quando nos referimos ao valor contido no endereço armazenado, ou seja, é o contrário da operação de referência.

A dereferência busca o valor que está no endereço gravado no ponteiro, isso quer dizer que o

valor obtido não está no ponteiro, mas no endereço que ele aponta. É importante entender isso porque quando alteramos o valor referenciado pelo ponteiro, na verdade estamos alterando o

valor da variável original e não do ponteiro.

A dereferencia é dada pelo operador *.

Ainda usando o exemplo da variável var1.

01.

#include <iostream>

02.

#include <cstdlib>

03.

using namespace std;

04.

 

05.

int main (){

06.

int var1 = 100;

07.

int *ptr1;

08.

ptr1 = &var1;

09.

cout << "O valor contido no endereco de memoria ";

10.

cout << ptr1 <<" e "<< *ptr1 << endl;

11.

system ("pause");

12.

}

Portanto, resumidamente, ponteiros se utilizam de referência e dereferência para acessar a memória, sendo a referência (&) o endereço de memória e a dereferência (*) o valor contido no endereço de memória.

Erros Comuns ao Utilizar Ponteiros

Um dos problemas que levaram a extinção do uso de ponteiros em linguagens mais recentes baseadas em C são os erros de lógica cometidos por programadores (inclusive experientes) que muitas vezes levava o programa ao crash ou erro fatal. A seguir, estão alguns problemas comuns que lidamos ao trabalharmos com ponteiros.

Ponteiros devem sempre apontar para algum endereço de memória. Portanto, todo ponteiro deve ser inicializado antes de ser utilizado.

Ex.: int *ptr1; cout << ptr1;.

Buscar
Buscar

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar
o Microsoft Windows 7? sim não parciais votar Siga-nos no Twitter FEED RSS - O que

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

o Microsoft Windows 7? sim não parciais votar Siga-nos no Twitter FEED RSS - O que

C/C++ - Ponteiros, referência e dereferência

19/10/15

Ponteiros não guardam valores, apenas endereços de memória, ou seja, se atribuímos um valor ao ponteiro, esse valor será um novo endereço de memória.

Ex.: ptr1 = &var1; ptr1 = 100;

Nós mudamos o endereço de memória que ptr1 está apontando, agora ele não aponta mais para o endereço de var1, e sim, para o endereço 100. Mas, o que tem no endereço 0x100 ? Esse é um erro muito comum.

Inicializar um ponteiro com o valor de uma dereferência.

Ex.: int *ptr1 = *var1;.

Esses são alguns dos erros mais comuns, embora praticamente todos os compiladores são capazes de impedir que eles ocorram.

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons.

‹ Typedef - Definição de Nomes de Tipos

Commons . ‹ Typedef - Definição de Nomes de Tipos Gostou? Indique nosso site! Páginas Relacionadas
Gostou? Indique nosso site!
Gostou?
Indique nosso site!

Páginas Relacionadas

C/C++ - Ponteiros de Struct

C/C++

Este artigo foi lido 33036 vezes

Ponteiros de Struct ›

Este artigo foi lido 33036 vezes Ponteiros de Struct › C/C++ - Ponteiros para Ponteiros C/C++

C/C++ - Ponteiros para Ponteiros

C/C++ - Ponteiro de Vetor

C/C++ - Ponteiro Como Argumento de Função

JavaScript - Array (vetores)

Java - This - auto-referência

» Programação › Algorítmo | C/C++ | Java

» Quem Somos

» Web › HTML/XHTML | JavaScript | PHP

» Contato

» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

» Termos de Uso

» Office › Word/Wirter | Excel/Calc

WWW.TIEXPERT.NET © 2007 - 2010

» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiros de Struct

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP Sistema
Programação
› Algoritmo
› C/C++
› Java
Web
› HTML/XHTML
› JavaScript
› PHP
Sistema Operacional
› Comandos de DOS
› Windows
› Linux
› Mac/BSD
Office
› Word / Writer
› Excel / Calc
Áreas do Site
› Download
› Fórum
› Blog
Parcerias
Recomendamos
Anúncios Google ► Struct c++
Anúncios Google
► Struct c++
Siga-nos no Twitter FEED RSS - O que é isso? Adicione aos Favoritos Buscar BLOG
Siga-nos no Twitter
FEED RSS - O que é isso?
Adicione aos Favoritos
Buscar
BLOG
FÓRUM
SITEMAP
QUEM SOMOS
CONTATO
TI Expert » Programação » C/C++ » Ponteiros de Struct
Enquete
Ponteiro de Struct
Vimos a pouco como criar uma estrutura de dados agrupado (struct), como definir um nome à
O Google Chrome OS
irá desbancar o
Microsoft Windows 7?
essa estrutura com typedef e como criar um ponteiro para indicar um endereço de memória.
sim
Agora, vamos nos aprofundar um pouco mais nesse assunto vendo como procedemos com um
ponteiro de struct.
não
Como vimos anteriormente, um struct consiste em vários dados agrupados em apenas um. Para
parciais
votar
acessarmos cada um desses dados, usamos um ponto (.) para indicar que o nome seguinte é o
nome do membro.
Um ponteiro guarda o endereço de memória que pode ser acessado diretamente.
O problema aqui está no seguinte, como acessaremos um membro de uma estrutura de dados
usando um ponteiro? Pois é simples. Para isso, basta usarmos o que chamamos de "seta". A
"seta" consiste de um sinal de menos e um maior (->).
Portanto, podemos criar nosso struct do mesmo jeito de sempre e nosso ponteiro também. Mas,
quando formos acessar um membro dessa estrutura usando um ponteiro nós não usaremos um
ponto, mas uma seta.
Vejamos:
01.
#include <iostream>
02.
#include <cstdlib>
03.
using namespace std;
04.
05.
typedef struct data Data;
06.
07.
struct data {
08.
short dia;
09.
short mes;
10.
int ano;
11.
};
12.
13.
int main (void){
14.
Data data; //variável data do tipo struct data
15.
Data *hoje; //ponteiro hoje para um tipo struct data
16.
hoje = &data; //hoje aponta para o endereço de data
17.
18.
//dados sendo inseridos na variável data
19.
hoje->dia = 20;
20.
hoje->mes = 1;
21.
hoje->ano = 2009;
22.
23.
//mostrando o que está gravado no endereço contido em hoje
24.
cout << "Data registrada:"<<endl;
25.
cout << hoje->dia <<"/"<< hoje->mes <<"/"<< hoje->ano << endl;
26.
system ("pause");
27.
}
Agora, há mais uma maneira de acessarmos um membro da estrutura usando um ponteiro. Esta
outra forma consiste em indicar de qual ponteiro nos referimos colocando o dereferenciador
entre parenteses, assim (*hoje). Dessa forma podemos acessar diretamente usando um ponto
(.).
No exemplo abaixo usamos apenas ponteiros com dereferenciador para escrever no struct data.
01.
#include <iostream>
02.
#include <cstdlib>
03.
using namespace std;
04.
05.
typedef struct data Data;
06.
07.
struct data {
08.
short dia;
09.
short mes;
10.
int ano;
11.
};
12.
13.
int main (void){
14.
Data data; //variável data do tipo struct data
15.
Data *hoje; //ponteiro hoje para um tipo struct data
16.
hoje = &data; //hoje aponta para o endereço de data
17.
18.
//dados sendo inseridos na variável data
19.
(*hoje).dia = 20;
20.
(*hoje).mes = 1;
21.
(*hoje).ano = 2009;
22.
23.
//mostrando o que está gravado no endereço contido em hoje
24.
cout << "Data registrada:"<<endl;
25.
cout << (*hoje).dia <<"/"<< (*hoje).mes <<"/"<< (*hoje).ano << endl;
26.
system ("pause");
27.
}
Concluindo, podemos acessar um membro de um tipo de dado estrutura de dado usando
ponteiro de duas formas:
Usando um dereferenciador entre parênteses e um ponto (.) para indicar o membro.
Usando o próprio ponteiro e uma seta (->) para indicar o membro.
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.
‹ Ponteiros, referência e dereferência
C/C++
Ponteiro de Vetor ›
Gostou?
Indique nosso site!
Este artigo foi
lido 54642 vezes

C/C++ - Ponteiros de Struct

19/10/15

Páginas Relacionadas

C/C++ - Estrutura de Dados - STRUCT

C/C++ - Typedef - Definição de Nomes de Tipos

C/C++ - Ponteiros para Ponteiros

C/C++ - Ponteiro de Vetor

C/C++ - Ponteiros, referência e dereferência

C/C++ - Ponteiro Como Argumento de Função

C/C++ - Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)

Java - This - auto-referência

» Programação › Algorítmo | C/C++ | Java

» Quem Somos

» Web › HTML/XHTML | JavaScript | PHP

» Contato

» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

» Termos de Uso

» Office › Word/Wirter | Excel/Calc

WWW.TIEXPERT.NET © 2007 - 2010

» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiro de Vetor

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP Sistema
Programação
› Algoritmo
› C/C++
› Java
Web
› HTML/XHTML
› JavaScript
› PHP
Sistema Operacional
› Comandos de DOS
› Windows
› Linux
› Mac/BSD
Office
› Word / Writer
› Excel / Calc
Áreas do Site
› Download
› Fórum
› Blog
Parcerias
Recomendamos
Anúncios Google ► C c++ c#
Anúncios Google
► C c++ c#
Blog Parcerias Recomendamos Anúncios Google ► C c++ c# Siga-nos no Twitter FEED RSS - O
Siga-nos no Twitter FEED RSS - O que é isso? Adicione aos Favoritos Buscar BLOG
Siga-nos no Twitter
FEED RSS - O que é isso?
Adicione aos Favoritos
Buscar
BLOG
FÓRUM
SITEMAP
QUEM SOMOS
CONTATO
TI Expert » Programação » C/C++ » Ponteiro de Vetor
Enquete
Ponteiros de vetor
Como já visto até agora, ponteiros são variáveis que guardam o endereço de memória de outra
O Google Chrome OS
irá desbancar o
Microsoft Windows 7?
variável. Veremos agora, como se aplica este recurso em vetores.
sim
Recapitulando o que são vetores: variáveis de endereço continuo na memória. Ou seja, enquanto
não
uma variável do tipo int ocupa, por exemplo, um bloco de memória, um vetor de 5 posições do
tipo int ocupa 5 blocos de memória.
parciais
votar
Para acessarmos cada item de um vetor usamos os índices que ficam entre colchetes ([]).
Há duas formas de trabalhar com ponteiros para vetor.
1. Usar índices no ponteiro como se ele fosse um vetor:
ponteiro = vetor;
ponteiro[indice1] = qualquer valor para ser gravado nesse índice;
ponteiro[indiceN] = qualquer valor para ser gravado nesse índice;
Preste atenção no seguinte detalhe. Apesar de ser ponteiro, ao atribuirmos um valor ao índice
não usamos o sinal de dereferência (*).
01.
#include <stdio.h>
02.
#include <stdlib.h>
03.
04.
int main (void){
05.
int vetor [2];
06.
int *v; // ponteiro
07.
v
= vetor;
08.
v[0] = 123;
09.
v[1] = 456;
10.
printf ("vetor[0] = %d\n", vetor[0]);
11.
printf ("vetor[1] = %d\n\n", vetor[1]);
12.
system ("pause");
13.
}
2. Usar o que chamamos de aritmética de ponteiros.

Exemplificando, seria algo como:

ponteiro = 0x00001100; ponteiro + 12 bytes; novo ponteiro = 0x00001100C;

‹ Ponteiros de Struct

C/C++

novo ponteiro = 0x00001100C; ‹ Ponteiros de Struct C/C++ Gostou? Indique nosso site! Páginas Relacionadas C/C++

Gostou?

Indique nosso site!

Páginas Relacionadas

C/C++ - Vetores Unidimensionais

C/C++ - Ponteiros de Struct

C/C++ - Ponteiros para Ponteiros

Faça o Download deste Código

Aritmética de ponteiros consiste em modificar o valor do ponteiro para ele indicar o próximo endereço de memória do vetor.

ponteiro = endereço do índice 0 do vetor; *(ponteiro+indice1) = qualquer valor para ser gravado nesse índice; *(ponteiro+indiceN) = qualquer valor para ser gravado nesse índice;

Perceba que aqui atribuimos um valor ao vetor usando um dereferenciador do ponteiro (*).

Quando somamos um número ao ponteiro, o que estamos fazendo é, na verdade, somar o número necessário de bytes para o próximo endereço.

Ex.: Se tivermos um ponteiro para um vetor de inteiro, quando formos calcular o terceiro espaço faremos *(ponteiro+3). Internamente será calculado o seguinte -> ponteiro + 3 × o tamanho de int (4 bytes). Então, 3 × 4 = 12 bytes.

Apesar de ser uma conta simples, não precisamos nos preocupar com isso. Porque o próprio sistema cuida de executar este cálculo.

     
 
 
 
 
 
 
 

printf ("Digite um valor para ser gravado no\n");

 
 
 
 
 

*(v+i) = valor; //valor é gravado no endereço apontado pelo ponteiro

 
 

printf ("Os valores gravados no vetor foram:\n");

 

printf("vetor[%d], ponteiro (%p) = %d\n", i, (v+i), vetor[i]);

 
 
 
 
     

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons.

Ponteiro Como Argumento de Função ›

Este artigo foi lido 37480 vezes

C/C++ - Ponteiros, referência e dereferência

Como Argumento de Função › Este artigo foi lido 37480 vezes C/C++ - Ponteiros, referência e

C/C++ - Ponteiro de Vetor

19/10/15

C/C++ - Ponteiro Como Argumento de Função

C/C++ - Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)

Java - Vetores e Matrizes

PHP - Arrays, Arrays Associativos, Vetores e Matrizes

JavaScript - Array (vetores)

Java - This - auto-referência

» Programação › Algorítmo | C/C++ | Java

» Quem Somos

» Web › HTML/XHTML | JavaScript | PHP

» Contato

» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

» Termos de Uso

» Office › Word/Wirter | Excel/Calc

WWW.TIEXPERT.NET © 2007 - 2010

» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiro Como Argumento de Função

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP Sistema
Programação
› Algoritmo
› C/C++
› Java
Web
› HTML/XHTML
› JavaScript
› PHP
Sistema Operacional
› Comandos de DOS
› Windows
› Linux
› Mac/BSD
Office
› Word / Writer
› Excel / Calc
Áreas do Site
› Download
› Fórum
› Blog
Parcerias
Recomendamos
Anúncios Google ► C++ ► C c++
Anúncios Google
C++
C c++

BLOG

FÓRUM

SITEMAP

QUEM SOMOS

BLOG FÓRUM SITEMAP QUEM SOMOS CONTATO TI Expert » Programação » C/C++ » Ponteiro Como Argumento

CONTATO

TI Expert » Programação » C/C++ » Ponteiro Como Argumento de Função

Ponteiros como Argumento de Funções

Vimos até agora, qual a importância dos ponteiros, como utilizá-los e principalmente qual sua

sintaxe.

Agora, começaremos a tratar de ponteiros em tópicos mais avançados, começando com o uso

de ponteiros como argumento de funções.

Primeiramente, iremos entender qual a vantagem de usarmos ponteiros como argumentos.

Até agora, apenas havíamos utilizado argumentos de valores.

Os argumentos de valores são cópias dos valores dos dados passados a função em sua chamada.

Exemplo:

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int mostrarNumero (int nr) {

05.

cout << nr << endl;

06.

}

07.

 

08.

int main (void) {

09.

int n = 10;

10.

mostrarNumero(n);

11.

system("pause");

12.

}

No exemplo acima, quando passamos a variável n para a função mostrarNumero o valor de n é

copiado para nr. Ou seja, o valor que está sendo manipulado dentro da função não é o valor original, mas uma cópia.

Isso nos impossibilita de acessar a variável diretamente, fazendo com que muitas vezes tenhamos que forçar nossa função retornar algum valor.

O

problema está quando criamos uma função que afeta diretamente várias partes da memória.

Neste caso, não é possível apenas retornarmos um valor para ser tratado novamente dentro do corpo do programa.

Abaixo esta um exemplo muito simples, mas que simplesmente não atende a nossas expectativas.

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int trocar (int a, int b) {

05.

 

int aux;

06.

 

aux = a;

07.

a

= b;

08.

b

= aux;

09.

}

10.

 

11.

int main (void) {

12.

int var1 = 10, var2 = 50;

13.

trocar (var1, var2);

14.

cout << "O valor de var1 e " << var1 << endl;

15.

cout << "O valor de var2 e " << var2 << endl;

16.

system("pause");

17.

}

A idéia da função acima é passar o valor de uma variável para outra. Mas, ao executarmos este

código, percebemos que ao final os valores de var1 e var2 continuam os mesmos.

Por quê? Simples. O que foi trocado dentro da função trocar foi a cópia dos valores de var1 e var2 que são a e b dentro da função. Ou seja, o que foi alterado na verdade foi o valor de a que passou para b e b que passou para a.

A troca aconteceu, mas não com as variáveis que queríamos.

Mas, se ao invés de utilizarmos o valor da variável, utilizássemos sua referência de memória, ou seja, o seu ponteiro.

Dessa forma, a função saberia que o valor a ser tratado já existe e está exatamente no local da memória que indicarmos. Portanto, o valor que seria tratado dentro da função não seria uma cópia, mas a variável original.

Então, vamos reformular a função do exemplo anterior usando a referência dos ponteiros (endereços contidos nos ponteiros) como argumentos dessa vez.

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int trocar (int &a, int &b) {

05.

 

int aux;

06.

 

aux = a;

07.

a

= b;

08.

b

= aux;

09.

}

10.

 

11.

int main (void) {

12.

int var1 = 10, var2 = 50;

13.

trocar (var1, var2);

14.

cout << "O valor de var1 e " << var1 << endl;

15.

cout << "O valor de var2 e " << var2 << endl;

16.

system("pause");

17.

}

Neste caso, usamos o endereço como forma de manipulação, e então, conseguimos trocar os valores de var1 e var2, pois a função não copiou os valores dessas variáveis, ele manipulou diretamente seus endereços de memória.

Aqui, podemos destacar mais uma vatangem que foi a economia de memória. Pois, não foi criado mais um espaço de memória, já que nós utilizamos diretamente o endereço de memória já alocado anteriormente por var1 e var2.

Buscar
Buscar

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

o Microsoft Windows 7? sim não parciais votar Siga-nos no Twitter FEED RSS - O que

C/C++ - Ponteiro Como Argumento de Função

19/10/15

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons. ‹ Ponteiro de Vetor
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.
‹ Ponteiro de Vetor
C/C++
Ponteiros para Ponteiros ›
Gostou?
Indique nosso site!
Este artigo foi
lido 25486 vezes
Páginas Relacionadas
C/C++ - Funções
C/C++ - Funções de Saída em C++
C/C++ - Funções (com argumentos)
C/C++ - Ponteiros de Struct
C/C++ - Recursividade
C/C++ - Funções de Entrada em C++
C/C++ - Ponteiros para Ponteiros
C/C++ - Ponteiros, referência e dereferência
C/C++ - Funções de Saída em C
C/C++ - Funções de Entrada em C
» Programação › Algorítmo | C/C++ | Java
» Quem Somos
» Web › HTML/XHTML | JavaScript | PHP
» Contato
» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD
» Termos de Uso
» Office › Word/Wirter | Excel/Calc
WWW.TIEXPERT.NET © 2007 - 2010
» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiros para Ponteiros

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP Sistema
Programação
› Algoritmo
› C/C++
› Java
Web
› HTML/XHTML
› JavaScript
› PHP
Sistema Operacional
› Comandos de DOS
› Windows
› Linux
› Mac/BSD
Office
› Word / Writer
› Excel / Calc
Áreas do Site
› Download
› Fórum
› Blog
Parcerias
Recomendamos
Anúncios Google ► C c++ ► Programacao ► Java c++
Anúncios Google
C c++
Programacao
Java c++

BLOG

FÓRUM

SITEMAP

QUEM SOMOS

CONTATO

BLOG FÓRUM SITEMAP QUEM SOMOS CONTATO Siga-nos no Twitter FEED RSS - O que é isso?

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

no Twitter FEED RSS - O que é isso? Adicione aos Favoritos Buscar TI Expert »
Buscar
Buscar

TI Expert » Programação » C/C++ » Ponteiros para Ponteiros

Ponteiros para Ponteiros

C/C++ nos permite criar, também, ponteiros com níveis de apontamento. O que isso quer dizer?

Simples. É possível criar um ponteiro que aponte para outro ponteiro, criando assim níveis, pois um ponteiro poderá apontar para outro ponteiro, que, por sua vez, aponta para outro ponteiro, que aponta para um ponteiro diferente e assim por diante.

A sintaxe para se criar ponteiros para ponteiros é a mesma de ponteiros comuns, apenas a

forma de acessar seus valores é diferente, pois para cada nível de apontamento usaremos um

dereferenciador. Por exemplo, se um ponteiro aponta para um ponteiro que aponta para um valor

inteiro, para acessarmos esse valor inteiro a partir do primeiro ponteiro usaríamos dois asteríscos (**), ao invés de apenas um (*).

Isso se dá ao fato que um ponteiro pode mudar o valor de outro ponteiro de acordo com seu

nível.

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar

O

exemplo abaixo demonstra uma sintaxe simples.

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int main (void) {

05.

int a=10, b=50;

06.

int *ptr;

// ponteiro de inteiro

07.

int **ptrPtr; // ponteiro de um ponteiro inteiro

08.

ptr = &a;

09.

ptrPtr = &ptr;

10.

cout << "O valor final de ptrPtr e " << **ptrPtr << endl;

11.

system("pause");

12.

return EXIT_SUCCESS;

13.

}

O

código acima contem duas variáveis inteiras (a e b) inicializados com os valores 10 e 50

respectivamente. Logo após, há uma variável de ponteiro (*ptr) e uma variável de ponteiro para ponteiro (**ptrPtr).

Então, atribuimos o endereço da variável inteira a em *ptr. Agora *prt aponta para a. Após isso, atribuimos o endereço do ponteiro *ptr ao ponteiro **ptrPtr. Neste momento **ptrPtr passa apontar para *ptr.

Nesse instante devemos prestar atencão no seguinte detalhe, no momento da impressão da

mensagem "O valor final de ptrPtr e " valor de a.

Entendendo os Níveis de Apontamento

Quando usamos ponteiros de ponteiros podemos usar os níveis de apontamento que são determinados pelo número de asteriscos que precedem o ponteiro.

Portanto, se um ponteiro aponta para um ponteiro que também aponta para um ponteiro que contem um endereço de uma variável char, usaríamos neste caso três asteríscos.

usamos o ponteiro do ponteiro para chegar até o

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int main (void) {

05.

char letra='a';

06.

char *ptrChar;

07.

char **ptrPtrChar;

08.

char ***ptrPtr;

09.

ptrChar = &letra;

10.

ptrPtrChar = &ptrChar;

11.

ptrPtr = &ptrPtrChar;

12.

cout << "O valor final de ptrPtr e " << ***ptrPtr << endl;

13.

system("pause");

14.

return EXIT_SUCCESS;

15.

}

Para entender melhor o acesso indireto que o ponteiro executa, vejamos o diagrama abaixo.

Funcionamento de ponteiro para ponteiro na memória

Este diagrama demonstra o que cada um dos asteriscos representa. Sabendo disso é possível alterar tanto o valor final da variável quanto o endereço apontado pelos ponteiros intermediários.

Vejamos a exemplificação abaixo.

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int main (void) {

05.

float var1 = 25.5;

06.

float var2 = 72.8;

07.

float *ptr;

08.

float **ptrPtr;

09.

ptr = &var1;

10.

ptrPtr = &ptr;

11.

cout << "O valor final de ptrPtr e " << **ptrPtr << endl;

12.

cout << "Pois o endereco de ptr e " << ptr << endl;

13.

*ptrPtr = &var2; //novo endereço no ponteiro intermediário

14.

cout << "\nO valor final de ptrPtr e " << **ptrPtr << endl;

15.

cout << "Pois o endereco de ptr e " << ptr << endl;

16.

system("pause");

17.

return EXIT_SUCCESS;

18.

}

No código acima podemos perceber a troca de um ponteiro intermediário.

C/C++ - Ponteiros para Ponteiros

19/10/15

A princípio atribuimos o endereço da variável var1 ao ponteiro ptr. Depois, atribuimos o endereço do ponteiro ptr ao ponteiro ptrPtr.

Na primeira vez que mandamos imprimir **ptrPtr (Importante! Note os dois asteriscos) será apresentado o valor contido em var1, porque ptrPtr acessa var1 indiretamente pelo ponteiro ptr.

Quando fazemos a operação *ptrPtr = &var2;, na verdade, não estamos alterando o valor contido em var1, mas o endereço contido no ponteiro ptr, porque usamos apenas um asterisco em ptrPtr.

Ou seja, usando apenas um asterisco acessaremos o ponteiro, não o valor apontado pelo ponteiro. Vejamos:

o ponteiro, não o valor apontado pelo ponteiro. Vejamos: Esse asterísco representa exatamente o ponteiro

Esse asterísco representa exatamente o ponteiro intermediário. Portanto, agora o ponteiro ptr não aponta mais para var1, ele aponta para var2.

Na segunda vez que imprimimos o valor de **ptrPtr não aparecerá o valor de var1, mas o valor de var2, porque o endereço contido no ponteiro intermediário ptr foi alterado para apontar para

var2.

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons.

‹ Ponteiro Como Argumento de Função

Ponteiros Nulos e Vazios (Null Pointers e Void Pointers) › C/C++

Nulos e Vazios (Null Pointers e Void Pointers) › C/C++ Páginas Relacionadas Gostou? Indique nosso site!

Páginas Relacionadas

Gostou? Indique nosso site!
Gostou?
Indique nosso site!

Este artigo foi lido 38257 vezes

Indique nosso site! Este artigo foi lido 38257 vezes C/C++ - Ponteiro de Vetor C/C++ -

C/C++ - Ponteiro de Vetor

C/C++ - Ponteiros, referência e dereferência

C/C++ - Ponteiro Como Argumento de Função

Java - Get e Set - Métodos Acessores

Java - Public, Private e Protected

JavaScript - Array (vetores)

Java - Acesso a Atributos e Métodos

Java - This - auto-referência

» Programação › Algorítmo | C/C++ | Java

» Quem Somos

» Web › HTML/XHTML | JavaScript | PHP

» Contato

» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

» Termos de Uso

» Office › Word/Wirter | Excel/Calc

WWW.TIEXPERT.NET © 2007 - 2010

» Áreas do Site › Downloads | Fórum | Blog

C/C++ - Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)

19/10/15

Programação › Algoritmo › C/C++ › Java Web › HTML/XHTML › JavaScript › PHP

Programação

› Algoritmo

› C/C++

› Java

Web

› HTML/XHTML

› JavaScript

› PHP

Sistema Operacional

› Comandos de DOS

› Windows

› Linux

› Mac/BSD

Office

› Word / Writer

› Excel / Calc

Áreas do Site

› Download

› Fórum

› Blog

Parcerias

Recomendamos

Anúncios Google ► Void pointer ► Null pointer ► C c++ c#
Anúncios Google
Void pointer
Null pointer
C c++ c#

ANÚNCIOS NO GOOGLE.

Podemos ajudar você a criar o seu. Vamos trabalha…

ANÚNCIOS NO GOOGLE. Podemos ajudar você a criar o seu. Vamos trabalha…

BLOG

FÓRUM

SITEMAP

QUEM SOMOS

CONTATO

Vamos trabalha… BLOG FÓRUM SITEMAP QUEM SOMOS CONTATO TI Expert » Programação » C/C++ » Ponteiros

TI Expert » Programação » C/C++ » Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)

Ponteiros Nulos e Vazios

Até o momento, temos estudado vários tipos de ponteiros que apontam para outros lugares e

assim por diante. Mas, C e C++ possuem outras formas de ponteiros, e, não obrigatoriamente, um ponteiro tem que apontar para algum lugar, pois um ponteiro simplesmente pode apontar para lugar nenhum.

Null Pointers (Ponteiros Nulos)

Nem sempre um ponteiro deve apontar para algum lugar, principalmente se este lugar ainda não

existir. Então, é possível um ponteiro ser nulo.

Para um ponteiro apontar para lugar algum devemos lhe atribuir o valor inteiro 0, ou a constante NULL. Não importa se o ponteiro for do tipo float, int, char, etc., pois automaticamente haverá um

typecasting para o tipo de dado correto.

É importante entender este conceito de ponteiro nulo porque facilita o trabalho com estruturas de

memória dinâmicas como listas encadeadas, filas, arvores binárias, etc. Pois, na maior parte do

tempo existirá um ponteiro, mas não um endereço físico já criado na memória.

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int main (void) {

05.

int *nullPointer;

06.

nullPointer = NULL;

07.

cout << nullPointer << endl;

08.

system ("pause");

09.

return EXIT_SUCCESS;

10.

}

Void Pointers (Ponteiros Vazios)

Chamamos de ponteiros vazios qualquer ponteiro que não possua um tipo de dado específico, ou seja, se seu tipo de dado for void.

Ponteiros vazios ou void pointers são ponteiros genéricos que podem apontar para qualquer outro tipo de dado, mas trazem consigo problemas lógicos.

Tais problemas residem no fato de que como são ponteiros vazios - não há um tipo de dado

específico - então, não podemos determinar seu tamanho, assim como também não podemos dereferenciá-lo diretamente.

Esses problemas são facilmente resolvidos se induzirmos o endereço void para o endereço do

tipo de dado correto, da mesma forma que executamos qualquer typecast.

Entender o conceito de void pointers (ponteiros vazios) é de suma importância para a compreensão de estruturas dinâmicas de memória, porque trabalharemos o tempo todo com funções que retornam endereços de memória genéricos (que podem ser qualquer tipo de endereço de memória, portanto sem tipo de dado - void).

01.

#include <iostream>

02.

using namespace std;

03.

 

04.

int main (void) {

05.

void *ptr;

06.

int *ptrVar1, var1 = 10;

07.

float *ptrVar2, var2 = 50.123;

08.

ptr = &var1; // ponteiro aponta para um inteiro

09.

ptrVar1 = (int*) ptr; // typecasting: ponteiro genérico p/ inteiro

10.

cout << *ptrVar1 << endl;

11.

ptr = &var2; // o mesmo ponteiro aponta agora para um float

12.

ptrVar2 = (float*) ptr; // typecasting: ponteiro genérico p/ float

13.

cout << *ptrVar2 << endl;

14.

system ("pause");

15.

return EXIT_SUCCESS;

16.

}

Como demonstrado no exemplo acima, ponteiros vazios podem apontar para qualquer tipo de dado (inteiro, float, char, etc), porém não podem ser dereferenciados diretamente. Para contornar este problema, usamos typecast para que um ponteiro concreto possa ser dereferenciado no lugar do ponteiro genérico.

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .
Autor: Denys William Xavier Este artigo está sob Licença Creative Commons .

Autor: Denys William Xavier Este artigo está sob Licença Creative Commons.

‹ Ponteiros para Ponteiros

Licença Creative Commons . ‹ Ponteiros para Ponteiros Gostou? Indique nosso site! Páginas Relacionadas C/C++ -
Licença Creative Commons . ‹ Ponteiros para Ponteiros Gostou? Indique nosso site! Páginas Relacionadas C/C++ -

Gostou?

Indique nosso site!

Páginas Relacionadas

C/C++ - Ponteiros de Struct

C/C++

Este artigo foi lido 24528 vezes

Ponteiros de Struct C/C++ Este artigo foi lido 24528 vezes C/C++ - Ponteiros para Ponteiros C/C++

C/C++ - Ponteiros para Ponteiros

C/C++ - Ponteiro de Vetor

C/C++ - Ponteiros, referência e dereferência

C/C++ - Ponteiro Como Argumento de Função

Buscar
Buscar

Enquete

O Google Chrome OS irá desbancar o Microsoft Windows 7?

sim não parciais votar
sim
não
parciais
votar
o Microsoft Windows 7? sim não parciais votar » Quem Somos Siga-nos no Twitter FEED RSS

» Quem Somos

Siga-nos no Twitter

FEED RSS - O que é isso?

Adicione aos Favoritos

Siga-nos no Twitter FEED RSS - O que é isso? Adicione aos Favoritos » Programação ›

» Programação › Algorítmo | C/C++ | Java

C/C++ - Ponteiros Nulos e Vazios (Null Pointers e Void Pointers)

19/10/15

» Web › HTML/XHTML | JavaScript | PHP

» Contato

» Sistema Operacional › Comandos de DOS | Windows | Linux | Mac/BSD

» Termos de Uso

» Office › Word/Wirter | Excel/Calc

WWW.TIEXPERT.NET © 2007 - 2010

» Áreas do Site › Downloads | Fórum | Blog