A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ponteiros.

Apresentações semelhantes


Apresentação em tema: "Ponteiros."— Transcrição da apresentação:

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 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

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

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 p aplicado a uma variável do tipo ponteiro, acessa o conteúdo do endereço de memória armazenado neste ponteiro

5 Ponteiros de variáveis
Exemplos de declarações: /* variável inteira */ int num; /* variável ponteiro para inteiro */ int *p; Memória p - 206 num - 202

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 p num 202 8 206 p num

7 Ponteiros de variáveis
Exemplo: int main( ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); }

8 Erros Comuns com Ponteiros
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! int main( ) { int a, b, *p; a = 2; *p = a; b = a + (*p); printf(" %d ", b); }

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.

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!

11 Vetores

12 Tipos de Dados Compostos
Combinaçã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 153

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) 159

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 159

15 Vetores O 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] algumas ling (algol 68, ada e apl) => a[3.:5,5:12] => subvetor bidimensional c/ 24 elementos 1. amarração em tempo de compilação: SUBCONJUNTO FIXADO QUANDO O PGM É ESCRITO -FORTRAN, C, PASCAL - variaveis estáticas e semi-estáticas 2. amarração em tempo de criação:subconjunto fixado em tempo de execucão de criação de uma instância de variável -variáveis semidinamicas 3. amarraçào em tempo de manipulação do objeto: vetores flexíveis - maior custo => típico de lps interpretativas: o tam. pode ser alterado em qq instante de seu tempo de vida => lps compiladas = ALGOL 68 e CLU => dinâmicas 159

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); 159

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); if (num == v[i]) cont++; if (cont) printf("Número existe \n"); else printf("Número NÃO existe \n"); } 159

18 Vetores e Ponteiros Existe uma forte associação entre vetores e ponteiros a variável que representa o vetor é uma constante que armazena o endereço inicial do vetor int vet[8]; vet (sem indexação) é um ponteiro para o primeiro elemento do vetor Inicialização: int vet[5]={5, 10, 15, 20, 25}; 159

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] 159

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); if (num == *(v+i)) cont++; if (cont) printf("Numero existe\n"); else printf("Numero NAO existe\n"); } 159

21 Agregados Homogêneos - Matrizes
Declaração: <tipo> <nome>[<tam1>] [<tam2>]; matriz 10 x 5  vetor de 2 dimensões int mat[10][5]; 160

22 Seqüências operações sobre cadeias:
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 164

23 String de Caracteres Trata cadeias de caracteres como vetores
char a[50], b[30] #define nome ”Maria” Utiliza funções para manipular strings Pode ter um número arbitrário de caracteres A linguagem C utiliza um '\0' como uma marca de fim de string

24 String de Caracteres Manipulaçã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> 126

25 String Strings de Caracteres Nome possui 5 posições Índices de 0 a 4
CUIDADOS ESPECIAIS char nome[5]; strcpy(nome, “Maria”); Nome possui 5 posições Índices de 0 a 4 M A R I A \0 1 2 3 4 5

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); }

27 Vetor de Strings #include <stdio.h> main() { char vet[4][50];
int i; for (i=0;i<4;i++) gets(vet[i]); printf("%s \n",vet[i]); }

28 Exercícios Lista de Exercícios: Vetor, String e Matriz


Carregar ppt "Ponteiros."

Apresentações semelhantes


Anúncios Google