• Like
P13 12
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
21
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
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