esinf - structures of information
DESCRIPTION
Essential C about structuresTRANSCRIPT
-
5/19/2018 ESINF - Structures of Information
1/36
Estruturas de Informao
Departamento de Engenharia Informtica (DEI/ISEP)
Ftima Rodrigues
Aspectos Essenciais em C++
-
5/19/2018 ESINF - Structures of Information
2/36
Referncias
-
5/19/2018 ESINF - Structures of Information
3/36
Operador de Referncia &
Uma declarao de varivel associa trs atributos fundamentais varivel: nome, tipo, endereo de varivel
int n ;
n
int n = 44 ;
00064fdf0
int
00064fdf0
3
n
Em C++ possvel obter o endereo de uma varivel utilizando ooperador referncia &
int
44
voidmain()
{ int n = 44 ;
cout
-
5/19/2018 ESINF - Structures of Information
4/36
Referncias
Uma referncia um nome alternativo (alias) para outra varivelTipo& nome-ref = nome-var
voidmain (){
int n = 44 ;
int& rn = n ; // rn sinnimo de n
cout
-
5/19/2018 ESINF - Structures of Information
5/36
Passagem de Parmetros
-
5/19/2018 ESINF - Structures of Information
6/36
Passagem de Parmetros por Valor
void troca(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
voidmain()
{
int a = 1, b = 2;
6
,
cout
-
5/19/2018 ESINF - Structures of Information
7/36
Passagem de Parmetros por Referncia
voidtroca(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
voidmain()
{
int a = 1, b = 2;
troca(a, b);
7
cout
-
5/19/2018 ESINF - Structures of Information
8/36
Passagem de Parmetros por Referncia
Constantevoidtroca (const int& x, const int& y)
{
int temp = x ;
x = y ; // ERRO: obj. const. no admite atribuies
y = temp ; // ERRO: idem}
O parmetro formal substitui o actual, mas como constante, no
8
a m te a tera o e va or
Caso no se pretenda alterar o valor do parmetro actual usa-se:Passagem por valor no caso de tipos de dados primitivosPassagem por referncia constante para tipos de dados no
primitivos, tipos de dados que ocupem grande quantidade deespao de armazenamento, pois a passagem por referncia impedeque o argumento seja duplicado
-
5/19/2018 ESINF - Structures of Information
9/36
Valores de Retorno
-
5/19/2018 ESINF - Structures of Information
10/36
Valores de Retorno
Um tipo de retorno de uma funo pode ser uma referncia desde queo valor devolvido seja um lvalue no local funo
intmax (int& m, int& n) //tipo de retorno uma referncia
{ return (m > n ? m : n) ; //m e n so referncias no locais}
Quando devolvido um valor (objecto), aquilo que devolvido
10
copiado no ambiente de retorno, recorrendo-se ao construtor cpia
Por questes de eficincia, no caso da devoluo de tipos noprimitivos, no se deve usar o retorno por valor mas o retorno por
referncia, para se evitar a invocao do construtor cpia
S podemos devolver referncias de objectos globais funo
-
5/19/2018 ESINF - Structures of Information
11/36
Funes que retornam referncias
Exemplo:
int v[5] = {2,4,6,8,10};
int& elemento(int i)
{
return v[i];
}
11
voidmain ()
{
elemento(3) = 7; // mesmo que v[3] = 7
elemento(3)++ ; // mesmo que v[3]++
}
Permite que funes apaream do lado esquerdo de atribuies!H um alis entre a funo e o objecto que ela devolve, noexemplo possvel alterar um valor de uma posio do vectorinvocando elemento(i)++
-
5/19/2018 ESINF - Structures of Information
12/36
Apontadores
-
5/19/2018 ESINF - Structures of Information
13/36
Variveis Dinmicas
Algumas Linguagens de Programao permitem ao programadorexplicitamente criar/destruir variveis durante a execuo doprograma
A rea de armazenamento destas variveis - variveis dinmicas - a Heap
Ao contrrio das variveis normais, as variveis dinmicas no
13
,
no tem sequer um identificador
Uma varivel dinmica sempre acedida atravs de uma varivelapontador
-
5/19/2018 ESINF - Structures of Information
14/36
Apontadores e Endereos
Um apontador uma varivel que contm o endereo de um objectoem memria (varivel, elemento de array, etc.)Ex:
int* pn = &n ; //pn um apontador que contm o endereo de um inteiro
00064fdf0
44n
14
voidmain(){ int n = 44 ;
cout
-
5/19/2018 ESINF - Structures of Information
15/36
Operador new
int* pn ;
Declara um apontador para inteiro, ou seja, atribui um endereo a pn,mas a memria nesse endereo ainda no est alocada, logo pn no
aponta para nenhuma memria alocada e portanto no pode seracedido
15
operador new
pn = new int ;
Uma varivel dinmica do tipo int criada, e o seu endereo colocado no apontador pn
-
5/19/2018 ESINF - Structures of Information
16/36
Operador de Desreferncia
Se pn apontar para n podemos aceder o valor de n atravs de pn
A expresso *pn ser avaliada como o valor de n, ou seja, ocontedo do apontado por pn
Aceder ou modificar a varivel dinmica criada feito atravs doapontador pn usando o operador *int* pn = new int ;
*pn = 7 ; // coloca 7 na varivel dinmica
16
cin >> *pn ; // l do teclado o valor a armazenar na varivel dinmica
if (*pn == 0) // testa se a var. dinmica contm 0
voidmain()
{ int n = 44 ;
cout
-
5/19/2018 ESINF - Structures of Information
17/36
Apontadores com zero e por inicializar
A nica constante que faz sentido atribuir a um apontador 0 (zero),para significar que no est a apontar para nada (porque garantidoque 0 no endereo vlido para dados)
-Podem-se comparar apontadores com a constante 0
double* p = new double ;
if (p == 0) abort() ;
else *p = 3.14159 ;
17
Se um apontador ainda no foi inicializado, no se pode aceder aoobjecto apontado (com operador desreferncia *)
float *p ; // p um apontador para float, no inicializado !
*p = 1.0 ; // Erro: p no foi alocado
float x;
float* p = &x; // OK: inicializa p com endereo de x
float* q;
q = new float; // OK: aloca memria para 1 float
*q = 3.14159 ; // OK: *q foi alocado
-
5/19/2018 ESINF - Structures of Information
18/36
Apontadores para Apontadores
A varivel ppn aponta para pn, que aponta para n. Assim *ppn umalis para pn, da mesma maneira que *pn um um alis para n, logo
int** ppn = &pn
18
**ppn tambm um alis para n
voidmain()
{ int n = 44 ;
cout
-
5/19/2018 ESINF - Structures of Information
19/36
Exemplo de manipulao de apontadores
int x = 1, y = 2;
int *p, *q;
p = &x;
q = p;
y = *p;
se paponta para x, *p
pode ocorrer em
qualquer contexto em
que xpoderia ocorrer
// p e q so apontadores para int
// coloca em p o endereo de x
// p agora aponta para x
// copia para q o contedo de p
// q agora tambm aponta para x
// coloca em y o valor do objecto apontado por p
19
*p = -1;
(*q)++;
y agora vale 1
// coloca no objecto apontado por p o valor -1
// x agora vale -1
// incrementa o valor do objecto apontado por q
// x agora vale 0
-
5/19/2018 ESINF - Structures of Information
20/36
Valores vlidos para um Apontador
Um apontador pode obter um valor vlido por:1. Cpia de outro apontador
Por atribuio Por passagem de parmetro
2. Atribuio do endereo de um objecto Aplicao do operador unrio & a um objecto Valor retornado pelo operador new
int var1 = 8 ;
=
int var1 = 8 ;
int var2 = 15
20
int *ap1, *ap2 ;
ap1 = &var1 ;
ap2 = &var2 ;
cout
-
5/19/2018 ESINF - Structures of Information
21/36
Apontadores para Objectos
class Ponto{
public:
double x;
double y;
}
Ponto* p = new Ponto ;
(*p).x = 22 ; // equivalente a p->x = 22 ;
21
Como p um apontador para um objecto Ponto, *p um objecto Ponto
(*p).x acede ao seu membro x
So necessrios parntesis na expresso (*p).x pois o operador directode seleco de membro . tem precedncia sobre o operadordesreferncia *
As duas notaes (*p).x e p->x so equivalentes
-
5/19/2018 ESINF - Structures of Information
22/36
Arrays
-
5/19/2018 ESINF - Structures of Information
23/36
Declarao de Arrays
int a[10];
o tamanho do array uma constante do tipo inteiro positivo
o smbolo a armazena o endereo de memria do array
Array de dimenso n uma sequncia de objectos do mesmo tiponumerados consecutivamente de 0, , n-1
23
ou outro tipo qualquer elementos deste array: a[0] , a[1], ...., a[9]
a:a[0]
a[exp] pode ocorrer em qualquer contexto em que uma variveldo tipo int poderia ocorrer
a[3] a[9]
-
5/19/2018 ESINF - Structures of Information
24/36
Inicializao de arrays
floatponto[2] = {1.0, 3.0};
o mesmo que
floatponto[2];
ponto[0] = 1.0;
ponto[1] = 3.0;
char se aradores 3 = ' ' ' n' ' t'
indicar lista de valores iniciaisentre chavetas (s ao declarar
o array!)
24
o mesmo que
char separadores[] = {' ', '\n', '\t'};
int a[4] = {3, 5};
o mesmo que
int a[4] = {3, 5, 0, 0};
o compilador calcula otamanho
os valores em falta socolocados a zero
-
5/19/2018 ESINF - Structures of Information
25/36
Cpia e Comparao de Arrays
No se pode usar o operador de atribuio (=) com arrays para copiaro contedo de um array para outro array ( necessrio copiarelemento a elemento)
int a[2], b[2];...
a = b; // ERRADO!
a[0] = b[0]; a[1] = b[1]; // OK!
25
No se podem usar os operadores de comparao (== !=) comarrays para comparar os contedos de dois arrays ( necessriocomparar elemento a elemento)
if (a == b) // No compara contedos mas endereos!!
if (a[0] == b[0] && a[1] == b[1]) // OK!!
-
5/19/2018 ESINF - Structures of Information
26/36
Arrays e Funes
Uma funo no pode retornar um array (i.e., o tipo de retorno nopode ser array)
No possvel passar um array por valor a uma funo
Uma funo pode ter argumentos do tipo array, mas estes sosempre passados "por referncia"
-Usar o qualificador const quando se pretende que o array
26
passa o n o se a a era o pe a un o
-O comprimento do array pode ser omitido na declarao de umargumento do tipo array - a funo pode receber um array dequalquer comprimento !
no caso de arrays de arrays, s o 1 comprimento pode seromitido
-
5/19/2018 ESINF - Structures of Information
27/36
Arrays e Funes
int somatorio (int a[], int n){ int sum = 0 ;
for (int i=0; i < n; i++)sum += a[i] ;
return sum ;}
intmain (){ int a[] = {11, 33, 55, 77} ;
Uma funo incapaz de calcularo tamanho de um array a elapassado
O tamanho do array tem de serpassado explicitamente funoque o processa
27
int size = sizeof(a)/sizeof(int) ;cout
-
5/19/2018 ESINF - Structures of Information
28/36
Arrays Multi-dimensionais
int a[3][4];
a um array de 3 arrays de 4 inteiros
int a[3, 4];
28
a[][0] a[][1] a[][2] a[][3]
a[0][3]
a[0][]
a[1][]
a[2][]
a[0, 3]
-
5/19/2018 ESINF - Structures of Information
29/36
Inicializao de arrays (cont.)
Inicializao de arrays de caracteres com strings literais:
char s[4] = "Ola";
o mesmo que
char s[4] = {'O', 'l', 'a', '\0'};
marca fim da string
29
Tambm se pode escrever:
char s[] = "Ola";
int a[2][3] = {{0, 1, 1}, {2, 3, 2}};
Inicializao de arrays de arrays
-
5/19/2018 ESINF - Structures of Information
30/36
Operaes com Apontadores para Eltos de Arrays
int a[4];
int *p = &a[2];
Pode-se somar ou subtrair um inteiro a um apontador
-pointer+ n : avana n elementos do tipo apontado porpointer
-pointer - n : recua n elementos do tipo apontado porpointer
-p+1 d &a[3]
a: a[2]
p:
30
Pode-se incrementar ou decrementar um apontadorp++; //p fica com &a[3]
Podem-se subtrair apontadores do mesmo tipo (d a distncia entreeles, em n de elementos do tipo apontado)
p - &a[0] d 2
Podem-se comparar apontadores do mesmo tipo
p > &a[0] d true
-
5/19/2018 ESINF - Structures of Information
31/36
Relao entre apontadores e arrays
O nome de um array pode ser usado como apontador para o seuprimeiro elemento
int a[4] = {1, 2, 3, 4};
int *p = a ; // mesmo que: int *p = &a[0]p = a + 2 ; // mesmo que: p = &a[0] + 2 ou ainda: p = &a[2]
Quando se passa um array a uma funo, de facto passa-se (por valor)
31
Na declarao de argumentos da funo, pode-se escrevervoid geravalores (int ap[])
ou equivalentemente (tornando explcito o que se passa na realidade)
void geravalores (int *ap)
Pode-se usar a notao indexada com apontadores
p[1] = 2; // mesmo que: *(p+1) = 2;
-
5/19/2018 ESINF - Structures of Information
32/36
Apontadores para percorrer Arrays
mesmo que *(&a[0] + i)
O operador[] equivalente ao
operador desreferncia *
intprocura (int x, const int a[], int n){
for (int i = 0; i < n; i++)
if (x == a[i] )
return i;
return -1;
}
32
intprocura (int x, const int a[], int n){
for (const int *p1 = a , *p2 = a + n; p1 < p2; p1++)
if (x == *p1)
return p1 - a;
return -1;
}mesmo que a[i]
-
5/19/2018 ESINF - Structures of Information
33/36
Apontadores para Arrays
Apontador para elemento de array Apontador para array(embora s vezes se fale em apontador para array querendo significarapontador para o 1 elemento do array - o endereo o mesmo mas otipo diferente)
Apontadores para arrays surgem quando se trabalha com arrays dearrays
int a[2][3];
33
int (*p1)[3]; // p1 apontador para array de 3 int's// lgica: *p1 um array de 3 inteiros
p1 = a; // mesmo que p1 = &a[0]
// p1 fica a apontar para o 1 sub-array de a
int *p2; // p2 um apontador para inteiro (que por acaso pode ser um// elemento de um array)
p2 = *p1 // p2 fica a apontar para a[0][0]
-
5/19/2018 ESINF - Structures of Information
34/36
Alocao e libertao dinmica de memria
new tipo - cria um objecto do tipo indicado e retorna o seu endereo,ou 0 em caso de erro
-objecto fica alojado numa zona de memria dinmica chamada"heap"
-pode-se inicializar objecto com: new tipo (valor-inicial)-endereo retornado deve ser atribudo a apontador do tipo: tipo *
-destruir objecto (libertando memria) com: delete apontador ;
34
new tipo [tamanho] - cria um array de objectos do tipo e tamanhoindicados e retorna o endereo do 1 objecto do array
-endereo retornado deve ser atribudo a apontador do tipo: tipo *
-destruir array (libertando memria) com: delete [ ] apontador ;
-til para criar arrays de tamanho conhecido apenas durante aexecuo do programa !
-Quando as posies de memria inicialmente alocadas a um arrayso esgotadas necessrio re-alocar novo bloco de memria
-
5/19/2018 ESINF - Structures of Information
35/36
Exemplo com Arrays Dinmicos!
#include
using namespace std ;
main()
{
int n;
cout > n;
int *v = new int [n] ;
" "
Array dinmico,alocado em tempo de
35
for (int i = 0; i < n; i++)cin >> v[i] ;
cout = 0; i--)
cout
-
5/19/2018 ESINF - Structures of Information
36/36
Re-Alocao de memria
#include using namespace std ;
voidmain(){ charpt ;int i=0, ind=0, cap=10 ;char *v = new char [cap] ;
cout > pt ;while (pt != '*'){if (i < cap)
36
v[i] = pt ;
i++ ; }else // realoca o dobro do espao{
cap *= 2 ;char* novoarr = new char [cap] ;
for (int j = 0 ; j < i ; ++j) //copia array v para o novonovoarr[j] = v[j] ;
delete [] v ; //liberta a memria
v = novoarr ; }cout > pt;
}