Your SlideShare is downloading. ×
0
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
P13 12
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

P13 12

32

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
32
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Programação MEAer e MEEC Bertinho Andrade da Costa 2013/2014 1º Semestre Instituto Superior Técnico Vectores e apontadores Programação DEEC-IST V ectores e apontadores 1
  • 2. Sumário     Vectores e apontadores Aritmética de apontadores  Incremento e decremento  Subtracção de apontadores Regra de Indexação Vectores e funções.  Passagem de vectores para dentro das funções Programação DEEC-IST V ectores e apontadores 2
  • 3. Vectores e apontadores  Considere as declarações seguintes, de vectores com a respectiva inicialização. Os vectores são armazenados na memória de forma contígua. char letras[4] ={‘a’, ‘b’, ‘c’, ‘d’}; int nums[3] = {5, 6, 7}; nums[0] 0x1004 nums[1] 0x1008 nums[2] 0x100c    5 6 7    'a' 'b' 'c' 'd'   0x1000 0x1001 0x1002 0x1003  letras[0] letras[1] letras[2] letras[3]   Variável Endereço Memória  Variável Endereço Memória NOTA: Cada variável ocupa 4 bytes NOTA: Cada variável ocupa 1 bytes Programação DEEC-IST V ectores e apontadores 3
  • 4. Vectores e apontadores  Em C, o nome do vector representa o endereço do primeiro elemento do vector. char *apc; int *api; apc = &(letras[0]); /* é equivalente a */ apc = letras; api = &(nums[0]); /* é equivalente a */ api = nums; Programação DEEC-IST V ectores e apontadores 4
  • 5. Aritmética de Apontadores  Um apontador pode ser incrementado de um número inteiro. apc = &(letras[2]); apc = apc + 1; /* *apc é o mesmo que letras[3] */ api = &(nums[0]); api = api + 2; /* *api é o mesmo que num[2] */  Um apontador pode ser decrementado de um número inteiro. apc = &(letras[3]); apc = apc - 3; /* *apc é o mesmo que letras[0] */ api = &(nums[1]); api = api - 1; /* *api é o mesmo que num[0] */ Programação DEEC-IST V ectores e apontadores 5
  • 6. Aritmética de Apontadores  O resultado da operação de incremento/decremento de um apontador, é realizado de modo a que seja equivalente ao incremento/decremento do índice do vector. O resultado é x objectos à frente/atrás do objecto que estava a ser apontado pelo apontador antes de ser manipulado.  O C não verifica se os acessos a um vector são feitos de forma correcta, isso depende do tipo de compilador.  O programador é responsável pela correcta manipulação dos índices dos vectores e dos apontadores. Programação DEEC-IST V ectores e apontadores 6
  • 7. Subtracção de Apontadores  É legal subtrair dois apontadores do mesmo tipo. O resultado consiste num número inteiro que representa o número de objectos que “estão entre os apontadores”. O resultado pode ser um número negativo dependendo dos valores dos endereços.  Mas é necessário ter cuidado com o resultado. Exemplo: d1 = &letras[3] - &letras[0]; /* dá o resultado de 3 */ d2 = &letras[0] - &letras[3]; /* dá o resultado de -3 */ d2 - d1 + 2 = ??? Programação DEEC-IST V ectores e apontadores 7
  • 8. Regra de indexação  Do exposto resulta que: float vecf[50], *apvi, *apvf; vecf[i] <=> *(&vecf[0] + i) <=> *(vecf+i) /* Regra de indexação em C */  Manipulação de um vector através de um apontador /* atribuição a um apontador, não é cópia do vector */ apv = vecf; apv[5] é equivalente a vecf[5] apvf = &vecf[49]; apvf[-49] é equivalente a vecf[0] Programação DEEC-IST V ectores e apontadores 8
  • 9. Regra de indexação  Considere-se a declaração, float vecf[50], *apv; apv = vecf; vecf = apv; /* é legal idêntico a apv=&vecf[0]*/ /* ilegal: atribuição ao endereço do vector */ &apv = vecf; /* ilegal: atribuição ao endereço de um apontador */ vecf = vecf + 1; /* ilegal: incrementar o endereço de um vector */ vecf[4] = *(apv + 6); /* Legal. Programação DEEC-IST V ectores e apontadores Justifique. */ 9
  • 10. Vectores como argumentos de funções  Em C, o nome de um vector é interpretado como o endereço do primeiro elemento do vector.  Existem duas formas de passar um vector para dentro de uma função:  Utilizando a notação de vector  Utilizando um apontador do tipo do vector.  Em ambos os casos é feita a passagem por apontador (referência).  Atribuições através do parâmetro formal da função correspondente ao vector provoca alterações no vector com que a função é chamada para execução. Programação DEEC-IST V ectores e apontadores 10
  • 11. Vectores como argumentos de funções  Exemplo: Utilização da notação vector #include <stdio.h> #define VDIM 5 /* Prototipo da funcao */ /* Na declaração do argumento vector */ /* não é necessário especificar a dimensão do vector */ float SomaElementosDoVector (int dim, float x[]); int main (void) { float v[VDIM] = {0.0, 1.1, 2.2, 3.3, 4.4}; float soma; /* Passamos a dimensão e o nome do vector */ soma = SomaElementosDoVector (VDIM, v); printf(“Soma = %f”, soma); return (0); } Programação DEEC-IST /* Não é necessário especificar a dimensão do vector */ /* devido a que não é reservada memória para o vector */ float SomaElementosDoVector (int dim, float x[]) { float somav = 0.0; int i; for (i=0; i<dim; ++i) somav += x[i]; return (somav); } V ectores e apontadores 11
  • 12. Vectores como argumentos de funções  Exemplo: Usando agora apontadores #include <stdio.h> #define VDIM 5 /* Prototipo da funcao */ /* Na declaração do argumento vector */ /* não é necessário especificar a dimensão do vector */ float SomaElementosDoVector (int dim, float *z); int main (void) { float v[VDIM] = {0.0, 1.1, 2.2, 3.3, 4.4}; float soma; /*Passamos a dimensão e o nome do vector*/ soma = SomaElementosDoVector (VDIM, v); printf(“Soma = %f”, soma); return (0); } Programação DEEC-IST float SomaElementosDoVector (int dim, float *z) { float somav = 0.0; int i; for (i=0; i<dim; ++i) { somav += *z; ++z; } return (somav); } V ectores e apontadores 12
  • 13. Programação DEEC-IST V ectores e apontadores 13

×