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

Post on 17-Apr-2015

102 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

top related