Upload
internet
View
105
Download
0
Embed Size (px)
Citation preview
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 paplicado 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
-
-
206
202
p
num
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 = #
/* 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
7
Ponteiros de variáveis
int main( ) {int a;int *p;p = &a;*p = 2;printf(" %d ", a);
}
Exemplo:
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!
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 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
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)
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
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]
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
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");
}
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};
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]
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");
}
21
Agregados Homogêneos - Matrizes
Declaração:<tipo> <nome>[<tam1>] [<tam2>];
matriz 10 x 5 vetor de 2 dimensões
int mat[10][5];
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
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
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>
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
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]);for (i=0;i<4;i++)
printf("%s \n",vet[i]);}
28
Exercícios
Lista de Exercícios:Lista de Exercícios:
Vetor, String e MatrizVetor, String e Matriz