1 ponteiros. 2 endereços de variáveis a linguagem c permite armazenamento e manipulação de...

28
1 Ponteiros

Upload: internet

Post on 17-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

1

Ponteiros

Page 2: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

2

Endereços de variáveis• A linguagem C permite armazenamento e

manipulação de endereços de memória

• Para cada tipo existente, pode existir um tipo ponteiro para armazenar o endereço de memória onde existe um valor daquele tipo

• Da mesma forma que declaramos uma variável para armazenar um tipo específico de dado (inteiro, por exemplo), podemos reservar espaço na memória para armazenar o endereço de memória de outra variável

Page 3: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

3

Ponteiros de variáveis

• Variável Ponteiro– guarda o endereço de uma variável (posição de

memória) cujo conteúdo correspondente ao seu tipo

• Sintaxe: para declarar um ponteiro que armazenará o endereço de uma variável do tipo <tipo_var>

<tipo_var> *<nome_ponteiro>;• Exemplo: int *p;

– cria uma variável p que pode armazenar um endereço de memória onde exista um inteiro armazenado

Page 4: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

4

Ponteiros de variáveis

• Operadores de Ponteiro: && e ** &a = (endereço da variável a)

aplicado a uma variável, resulta no endereço da posição de memória reservada para a variável

*p = conteúdo da variável cujo endereço está armazenado em paplicado a uma variável do tipo ponteiro,

acessa o conteúdo do endereço de memória armazenado neste ponteiro

Page 5: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

5

Ponteiros de variáveis

Exemplos de declarações:

/* variável inteira */int num;

/* variável ponteiro para inteiro */int *p;

Memória

-

-

206

202

p

num

Page 6: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

6

Ponteiros de variáveis

Exemplos:/* num recebe o valor 5 */num = 5;

/* p recebe o endereço de num diz-se que p aponta para num */p = &num;

/* conteúdo de p recebe o valor 8 */

*p = 8;

-5

206

202

p

num

202

5

206

202

p

num

202

8

206

202

p

num

Page 7: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

7

Ponteiros de variáveis

int main( ) {int a;int *p;p = &a;*p = 2;printf(" %d ", a);

}

Exemplo:

Page 8: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

8

Erros Comuns com Ponteiros

int main( ) {int a, b, *p;a = 2;*p = a;b = a + (*p);printf(" %d ", b);

}

Usa a memória apontada por p sem inicializar p,

que contém "lixo" inicialmente; armazena 2

em uma posição de memória desconhecida.

Isto pode fazer com que o programa grave dados em um espaço de outro programa, por exemplo!

Page 9: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

9

Erros Comuns com Ponteiros

int main( ) {int a, b, *p;a = 2;*p = &a;printf(" %d ", *p);

}

Tenta armazenar em p o endereço de a,

mas na verdade está armazenando em uma outra posição

de memória apontada por p, que

é desconhecida.

Page 10: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

10

Erros Comuns com Ponteiros

int main( ) {int a, *p;a = 15;p = a;printf(" %d ", *p);

}

Não guarda o endereço de a em p, mas sim o conteúdo

de a; quando escreve *p, estará

escrevendo o conteúdo da

memória localizada no endereço 15 e não o valor 15!

Page 11: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

11

Vetores

Page 12: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

12

Tipos de Dados CompostosCombinação (agregados) de

estruturas mais simples:– de elementos homogêneos:

vetor/matriz– de elementos heterogêneos: struct

estruturas tem um único nome– a manipulação é feita sobre um

componente elementar de cada vez – algumas linguagens permitem atribuir

valores ou comparar agregados inteiros

Page 13: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

13

Estruturas Homogêneas

Conjunto finito de posições de memória do mesmo tipo, referenciadas por um nome comum

Os elementos são acessados através de um índices

Em C, todos os vetores consistem em posições contíguas de memória

Podem ter uma (vetor) ou mais dimensões (matriz)

Caso particular: string (vetor de caracteres)

Page 14: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

14

Vetores

Declaração:<tipo> <nome>[<tamanho>];

Um elemento pode ser acessado por indexação: <nome>[<índice>]

Se <índice> estiver fora do domínio implica em erro, detectado em tempo de execução

Page 15: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

15

VetoresO primeiro elemento tem sempre

índice zero e o último tem índice <tamanho>-1

Uma referência a primeira posição da área onde o objeto de informação está armazenado é um ponteiro

Exemplo:float vet[8];

– vetor para armazenar números reais de 8 posições

– os elementos variam de vet[0] até vet[7]

Page 16: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

16

Vetores - Exemplo/* Cálculo da média e variância de 8 números reais */#include <stdio.h>main( ) {

float v[8], med=0, var=0;int i;for (i=0 ; i<8; i++) {

scanf("%f", &v[i]);med += v[i];

}med = med / 8;for (i=0 ; i<8; i++)

var += (v[i]-med) * (v[i]-med);var = var / 8;printf("Media = %f \t Variancia = %f \n", med,

var);}

N

)med(xvar

N

xmed

2

Page 17: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

17

Vetores - Exemplo/* Verificar a existência de um número no vetor */

#include <stdio.h>main( ) {

float v[8], med=0, var=0, num;int i, cont=0;for (i=0 ; i<8; i++)

scanf("%f", &v[i]);scanf("%f", &num);for (i=0 ; i<8; i++)

if (num == v[i])cont++;

if (cont)printf("Número existe \n");

elseprintf("Número NÃO existe \n");

}

Page 18: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

18

Vetores e PonteirosExiste uma forte associação entre

vetores e ponteirosa variável que representa o vetor é

uma constante que armazena o endereço inicial do vetorint vet[8];– vet (sem indexação) é um ponteiro

para o primeiro elemento do vetor Inicialização:

int vet[5]={5, 10, 15, 20, 25};

Page 19: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

19

Vetores e Aritmética de Ponteiros

Operações permitidas: adição e subtração Sendo p um ponteiro para um elemento do

vetor, p+1 representa um ponteiro para o próximo elemento do vetor armazenado na memória (desde que não exceda o limite)

Exemplo:(vet+i): ponteiro para o elemento vet[i]

corresponde a &vet[i]

*(vet+i): conteúdo do elemento vet[i]corresponde a vet[i]

Page 20: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

20

Vetores & Ponteiros - Exemplo

/* Verificar a existência de um número no vetor */#include <stdio.h>main( ) {

float v[8], med=0, var=0, num;int i, cont=0;for (i=0 ; i<8; i++)

scanf("%f", &v[i]);scanf("%f", &num);for (i=0 ; i<8; i++)

if (num == *(v+i))cont++;

if (cont)printf("Numero existe\n");

elseprintf("Numero NAO existe\n");

}

Page 21: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

21

Agregados Homogêneos - Matrizes

Declaração:<tipo> <nome>[<tam1>] [<tam2>];

matriz 10 x 5 vetor de 2 dimensões

int mat[10][5];

Page 22: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

22

Seqüências

Exemplo: cadeias de caracteres (strings) operações sobre cadeias:

– concatenação– seleção do primeiro ou último componente– uma subcadeia pode ser extraída

especificando-se as posições do primeiro e do último caracteres desejados

Page 23: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

23

String de CaracteresTrata cadeias de caracteres como

vetoreschar a[50], b[30]#define nome ”Maria”

Utiliza funções para manipular stringsPode ter um número arbitrário de

caracteresA linguagem C utiliza um '\0' como uma

marca de fim de string

Page 24: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

24

String de CaracteresManipulação de strings

– strcpy(s1,s2): copia s2 em s1– strcat(s1,s2): concatena s2 no final de

s1– strlen(s1): tamanho de s1– strcmp(s1,s2): zero de s1==s2,

negativo se s1<s2 e positivo se s1>s2

– requerem: #include <string.h>

Page 25: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

25

String Strings de Caracteres

– CUIDADOS ESPECIAISchar nome[5];strcpy(nome, “Maria”);

M A R I A \0

0 1 2 3 4 5

Nome possui 5 posiçõesÍndices de 0 a 4

Page 26: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

26

Strings - Exemplo#include <stdio.h>#include <string.h>main() {

char s1[80], s2[80];unsigned int i;printf("Informe duas palavras\n");gets(s1); gets(&s2[0]);printf("Tamanhos: s1=%d \t s2=%d \n",strlen(s1), strlen(s2));printf("\nString 1 \n");for (i=0; i<strlen(s1); i++)

printf("Letra %d: %c \n",i+1,s1[i]);printf("\nString 2 \n");for (i=0; i<strlen(s2); i++)

printf("Letra %d: %c \n",i+1,*(s2+i));strcat(s1,s2);puts(s1);

}

Page 27: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

27

Vetor de Strings

#include <stdio.h>main() {

char vet[4][50];int i;for (i=0;i<4;i++)

gets(vet[i]);for (i=0;i<4;i++)

printf("%s \n",vet[i]);}

Page 28: 1 Ponteiros. 2 Endereços de variáveis A linguagem C permite armazenamento e manipulação de endereços de memória Para cada tipo existente, pode existir

28

Exercícios

Lista de Exercícios:Lista de Exercícios:

Vetor, String e MatrizVetor, String e Matriz