• Embed Doc
  • Readcast
  • Collections
  • CommentGo Back
Download
 
 
5
Ponteiros e
 strings
Objetivos
• Ser capaz de usar ponteiros.• Ser capaz de usar ponteiros para passar argumentos para funções através de chamadas por referência.• Entender as relações próximas entre ponteiros, arrays e
 strings.
• Entender o uso de ponteiros para funções.• Ser capaz de declarar e usar arrays de
 strings.Os endereços nos são dados para ocultarmos nossos paradeiros.
Saki (H. H. Munro)
 Através de indireções, encontre as direções.
William Shakespeare, Hamlet
Muitas coisas, estando em total anuência, podem funcionar de forma contrária.
William Shakespeare, King Henry V
Você sempre pode encontrar uma prática muito boa para verificar suas referências, senhor!
Dr. Routh
Você não pode confiar num código que você mesmo não criou totalmente. (Especialmente um código feito por empresas que empregam pessoas como eu).
Ken Thompson, 1983 Turing Award Lecture Association for Computing Machinery, mc.
320
C++
COMO
PROGRAMAR
Vis
ã
o Geral
5.1 Introdu
çã
o5.2 Declara
çõ
es e inicializa
çã
o de vari
á
veis ponteiro5.3 Operadores sobre ponteiros5.4 Chamando fun
çõ
es por refer
ê
ncia5.5 Usando o qualificador
const
com ponteiros5.6
Bubbie Sort 
usando chamada por refer
ê
ncia
57
Express
õ
es com ponteiros e aritm
é
tica de ponteiros5.8 A rela
çã
o entre ponteiros e arrays
 
5.9 Arrays de ponteiros5.10 Estudo de caso: uma simula
çã
o de embaralhamento e distribui
çã
o de cartas5.11 Ponteiros de fun
çã
o5.12 Introdu
çã
o ao processamento de caracteres e
strings 
5.12.1 Fundamentos de caracteres e
strings 
5.12.2 Fun
çõ
es de manipula
çã
o de
strings 
da biblioteca de tratamento de
strings 
5.13 (Estudo de caso opcional) Pensando em objetos: colabora
çõ
es entre objetos
 Resumo• Terminologia Erros comuns de programação Boas práticas de programação Dicas de desempenho
.
 Dicas de portabilidade. Observações de engenharia de software
 Dica de teste e depura ção. Exercícios de auto-revisão
.
 Respostas aos exercícios de auto-revisão
 Exercícios Seção especial: construindo seu próprio computador• Maisexercícios sobre ponteiros Exercícios de manipulação de
strings•
Seção especial: exercícios avançados demanipulação de
strings.
Um projeto desafiador de manipulação de
strings
5.1 Introdu
çã
o
 Neste capítulo, discutimos uma das características mais poderosas da linguagem de programação C++, o ponteiro. Os ponteiros estão entre os recursos mais difíceis de serem dominados de C++. No Capítulo 3, vimos que teferências podem ser usadas para executar chamadas por referência. Os ponteiros possibilitam aos programas simular chamadas por referência e criar e manipular estruturas de dados dinâmicas, i.e., estruturas de dados que podem crescer e encolher,tais como listas encadeadas, filas, pilhas e árvores. Este capítulo explica conceitos básicos sobre ponteiros. Reforçatambém a relação íntima entre arrays, ponteiros e
 strings,
e inclui uma boa relação de exercícios de processamento de
 strings.
O Capítulo 6 examina o uso de ponteiros com estruturas. Nos Capítulos 9 e 10, veremos que a programação orientada aobjetos é executada com ponteiros e referências. O Capítulo 15 introduz técnicas dinâmicas de administração dememória e apresenta exemplos de criação e uso de estruturas de dados dinâmicas.A visão de arrays e strings como ponteiros é derivada de C. Mais à frente no livro, discutiremos arrays e
 strings
como objetos no sentido pleno.
5.2 Declara
çõ
es e inicializa
çã
o de vari
á
veis ponteiro
As variáveis ponteiro contêm endereços de memória como seus valores. Normalmente. uma variável contém dita-mente um valor específico. Um ponteiro, por outro lado, contém um endereço de uma variável que contém um valor específico. Neste sentido, um nome de variável referencia
diretamente
um valor e um ponteiro referencia
indiretamente
um valor (Fig.
5.
1). Referenciar um valor através de um ponteiro é chamado de
indireção.
CAPÍTULO
5
-
PONTEIROS E
 STRINGS 
321
count count
diretamentereferencia umavari
á
vel cujovalor
é
7countPtr
count countPtr
indiretamentereferencia umavari
á
vel cujo
 _______ ______ 
valor
é
7
Fig. 5.1
Referenciando direta e indiretamente uma vari
á
vel.Ponteiros, como quaisquer outras vari
á
veis, devem ser declarados antes de poderem ser usados. Adeclara
ç
ao
int *countPtr, count;
declara a vari
á
vel
countPtr como
sendo do tipo int
*
(i.e.,
um
ponteiro para
um
valor do tipo inteiro) e
é
 lida como “countptr
é
um ponteiro para int” ou “countptr aponta para um objeto do tipo inteiro”. Al
é
m disso, avari
á
vel count
é
declarada como inteira e n
ã
o como um ponteiro para um inteiro. O
*
se aplica somente acountPtr na declara
çã
o acima. Cada vari
á
vel que est
á
sendo declarada como um ponteiro deve serprecedida por um asterisco
(*).
Por exemplo, a declara
çã
odouble
*xptr, *yptr;
 
indica que tanto xPtr como yPtr s
ã
o ponteiros para valores de tipo double. Quando o
*
é
usado destamaneira em uma declara
çã
o, ele indica que a vari
á
vel que est
á
sendo declarada
é
um ponteiro. Podemosdeclarar ponteiros para apontar para objetos de qualquer tipo.
 Erro comum de programação 5.1
 Assumir que o
*
usado para declarar um ponteiro se aplica a todos os nomes de variáveis, em uma lista de variáveis ponteiro separadas por vírgulas, pode fazer com que os ponteiros sejam declarados não como ponteiros. Cada ponteiro deve ser declarado com o
*
 prefixado ao nome.
 Boa prática
de programação 5.1 Embora não seja obrigatório fazer isso, incluir as letras
Ptr
em nomes de variáveis ponteiro torna claroque estas variáveis são ponteiros e precisam ser manipuladas de acordo.
Os ponteiros deveriam ser inicializados ou quando forem declarados ou em um comando de atribui
çã
o. Umponteiro pode ser inicializado como O, NULL ou um endere
ç
o. Um ponteiro com o valor O ou NULL n
ã
oaponta para nada. NULL
é
uma constante simb
ó
lica definida no arquivo de cabe
ç
alho <iostream> (e emv
á
rios arquivos de cabe
ç
alho da biblioteca padr
ã
o). Inicializar um ponteiro com NTJLL
é
equivalente ainicializar um ponteiro com O. mas, em
c++,
é
prefer
í
vel usar O. Quando
é
usado O, ele
é
convertido emum ponteiro do tipo apropriado. O valor O
é
o
ú
nico valor inteiro que pode ser atribu
í
do diretamente a umavari
á
vel ponteiro sem fazer primeiro a coer
çã
o do inteiro para um tipo de ponteiro. A atribui
çã
o do endere
ç
ode uma vari
á
vel para um ponteiro
é
discutida na Se
çã
o 5.3.
 Dica de tes(e e depura ção 5.1
Sempre inicialize ponteiros para evitar apontar para áreas de memória desconhecidas ou não-inicializadas.
322 C++
COMO PROGRAMAR
5.3 Operadores sobre ponteiros
O
&,
ou
operador de endereço,
é um operador unário que retorna o endereço de seu operando. Por exemplo, assumindoas declaraçõesint y
=
5;int
*yptr;
o comandoyPtr 
=
atribui o endereço da variável y à variável ponteiro yPtr. Diz-se, então, que a variável yPtr “aponta para” y. A Fig. 5.2mostra uma representação esquemática da memória depois que a atribuição precedente foi executada. Na figura,mostramos a “relação de apontar” desenhando uma seta que vai do ponteiro até o objeto por ele apontado.
Fig. 5.2 Representa
çã
o gr
á
fica de um ponteiro que aponta para uma vari
á
vel inteira na mem
ó
ria.
A Fig. 5.3 mostra a representação do ponteiro na memória, assumindo que a variável de tipo inteiro y está armazenadana posição 600000 e a variável ponteiro yPtr está armazenada na posição 500000. O operando do operador de endereçodeve ser um
ivalue
(i.e., algo ao qual um valor pode ser atribuído, tal como um nome de variável); o operador deendereço não pode ser aplicado para constantes, para expressões que não resultam em referências ou para variáveisdeclaradas com a classe de armazenamento register.
Fig. 5.3 Representa
çã
o de y e yptr na mem
ó
ria.
O
operador 
*,
comumente chamado de
operador de indireção
ou
operador de derreferência,
retoma um sinônimo, umnome alternativo ou um apelido para o objeto para qual seu operando (i.e., um ponteiro) aponta. Por exemplo (fazendoreferência à Fig. 5.2 novamente), o comando
cout
«
*yptr
«
eridi;imprime o valor da variável y, isto é, 5, quase do mesmo modo como o comandocout
«
y
«
endJ.;faria. Usar 
*
desta maneira é chamado de
derreferenciar um ponteiro.
 Note que um ponteiro derreferenciado também pode ser usado do lado esquerdo de um comando de atribuição, como em
*yptr
=
9;
yptr y y
5000001
600000
of 00

Leave a Comment

You must be to leave a comment.
Submit
Characters: ...
You must be to leave a comment.
Submit
Characters: ...