You are on page 1of 9

18/05/2011

Lógica e Estrutura de Dados Fundamentais

Professor: Eduardo O. Teles

Lógica e Estrutura de Dados Fundamentais

Ponteiros são usados em situações em que é necessário conhecer o endereço onde está armazenada a variável e não o seu conteúdo. Um ponteiro é uma variável que contém um endereço de memória e não o conteúdo da posição. A figura abaixo mostra um mapa de um trecho de memória que contém duas variáveis (num, res) inteiras de tipo longo (4 bytes cada uma).

2 Professor: Eduardo O. Teles

1

int *p1. p2 = &i. 50 }. } 4 Professor: Eduardo O. Além disso. p2 = p1. void main(void) { int vetor[ ] = { 10. Por exemplo. printf("%d\n".18/05/2011 Lógica e Estrutura de Dados Fundamentais DECLARAÇÃO Exemplo: int *res. o comando num = *res. float *div. /* ponteiro para uma variável inteira */ /* ponteiro para uma variável de ponto flutuante */ OPERADORES O operador & devolve o endereço de memória do seu operando. *p1). O operador * devolve o valor da variável localizada no endereço que o segue. 40. *p2). printf("%d\n". Teles 2 . 30. p1 = &vetor[2]. 3 Professor: Eduardo O. 20. int i = 100. no trecho de programa abaixo o endereço do terceiro elemento do vetor v é carregado em p1 e o endereço da variável i é carregado em p2. /* o endereco de soma e carregado em pint */ O operador * é o complemento de &. Teles Lógica e Estrutura de Dados Fundamentais Por exemplo. Os comandos printf imprimem os valores apontados pelos ponteiros respectivos. *p2. no final o endereço apontado por p1 é carregado em p2. *p2). printf("%d\n". pint = &soma.

0 }. printf("%d\n". p1++.0. p1 = &vetor[2]. p1-p2). 2. Teles Lógica e Estrutura de Dados Fundamentais A diferença entre ponteiros fornece quantos elementos do tipo do ponteiro existem entre os dois ponteiros. 4. Teles 3 . No exemplo abaixo é impresso o valor 3. } Não é possível multiplicar ou dividir ponteiros. void main(void) { int vetor[ ] = { 10. O primeiro printf imprime 30 o segundo 40 e o terceiro 50.0. *p1). 6 Professor: Eduardo O. *p1). 40. 50 }. *p1).0. 5. e não se pode adicionar ou subtrair o tipo float ou o tipo double a ponteiros. /* endereco do terceiro elemento */ p2 = &vetor. float *p1. *p2. int *p1. p1 = &vetor[2]. printf("%d\n". 30. 3. /* endereco do primeiro elemento */ printf("Diferenca entre ponteiros %d\n". 20. p1 = p1 + 1.0. void main(void) { float vetor[ ] = { 1.18/05/2011 Lógica e Estrutura de Dados Fundamentais INCREMENTANDO E DECREMENTANDO PONTEIROS O exemplo abaixo mostra que operações de incremento e decremento podem ser aplicadas em operandos. printf("%d\n". } 5 Professor: Eduardo O.

Teles 4 . i++) printf("%. for (i=0. Só é possível comparar ponteiros de mesmo tipo. for (i=0.0.0. int i. 2. 3. system("pause"). 6.\n"). } 8 Professor: Eduardo O. 5.0}. 9.18/05/2011 Lógica e Estrutura de Dados Fundamentais COMPARAÇÃO DE PONTEIROS É possível comparar ponteiros em uma expressão relacional. c. 4.0. 7 Professor: Eduardo O. i++) printf("%.0. 7. char *c. v[i]).\n").0. i<9. O trecho de programa abaixo ilustra um exemplo deste tipo de operações. if (c == v) printf("As variáveis estao na mesma posicao. v).0. printf("\n"). printf("\n"). *(v+i)). scanf("%c %c". Else printf("As variaveis nao estao na mesma posicao. *v.0. Teles Lógica e Estrutura de Dados Fundamentais v[i] == *(v+i) &v[i] == v+i int main(void) { float v[] = {1.0. 8. i<9.1f ".1f ".

8. sem que espaço seja reservado. for (i=0. } 10 Professor: Eduardo O. *(v+i)).0.0. 9. i++) printf("%. i<9.0. int i.0}. Na declaração de vetor a compilador automaticamente reserva um bloco de memória para que o vetor seja armazenado.0. Teles 5 .1f ". 9 Professor: Eduardo O.1f ".18/05/2011 Lógica e Estrutura de Dados Fundamentais Existe uma diferença fundamental entre declarar um conjunto de dados como um vetor ou através de um ponteiro. system("pause"). i++) printf("%.0. 4.0. i<9.0. v[i]). 2. Teles Lógica e Estrutura de Dados Fundamentais PERCORRER VETOR int main(void)* { float v[] = {1.1f ". Quando apenas um ponteiro é declarado a única coisa que o compilador faz é alocar um ponteiro para apontar para a memória. 5. for (i=0. *p). i++. float *p. i<9. 6. printf("\n"). printf("\n"). p++) printf("%. 7.0. 3. for (i=0. p=v.

scanf("%f". registros são conhecidos como structs (abreviatura de structures). sizeof(float)). printf("Li valor %f \n". } A função calloc() aloca um bloco de tamanho (numitens*tamanho) e armazena zeros em todas as posições. } x. v = calloc(tam. O exemplo abaixo declara um registro x com três campos (ou membros) inteiros: struct { int dia. 11 Professor: Eduardo O. i). scanf("%d".18/05/2011 Lógica e Estrutura de Dados Fundamentais int main(void) { float *v. &tam). Teles Lógica e Estrutura de Dados Fundamentais STRUCT Um registro (= record) é uma coleção de várias variáveis. } else printf("Nao consegui alocar memoria."). printf("\n"). tam. *(v+i)). i<tam. system("pause"). i++){ printf("Elemento %d ?". v+i). Na linguagem C. int ano. printf("Qual o tamanho do vetor? "). if (v) { for (i=0. int mes. possivelmente de tipos diferentes. Teles 6 . int i. } free(v). 12 Professor: Eduardo O.

ano = 1998. struct dma y. data *p. data x. /* mesmo efeito que (*p). int mes. 13 Professor: Eduardo O. 14 Professor: Eduardo O.mes = 8 */ Registros podem ser tratados como um novo tipo-de-dados.mes : p->mes = 8. Teles Lógica e Estrutura de Dados Fundamentais struct dma *p.. /* um registro x do tipo dma */ /* um registro y do tipo dma */ É fácil atribuir valores aos campos de um registro: x. int ano. x. p = &x.dia = 31 */ é uma abreviatura muito útil para a A expressão p->mes expressão (*p). x. dma parece um nome apropriado: struct dma { int dia. p->ano = 1998. p = &x.18/05/2011 Lógica e Estrutura de Dados Fundamentais É uma boa ideia dar um nome ao tipo de registro.dia = 31. Por exemplo: typedef struct dma data. struct dma x. struct dma x. (*p).mes = 8.dia = 31. /* p é um ponteiro para registros dma */ /* agora p aponta para x */ /* mesmo efeito que x. Teles 7 . }. No nosso exemplo.

char estado[2]. cidade. estado e cep: struct T_endereco{ char nome[30].h> #include <string. // declaração de variáveis do struct endereco e2. char estado[2]. char rua[30]. char cep[10]. long int cep. rua.h> struct endereco { char rua[40]. 15 Professor: Eduardo O.18/05/2011 Lógica e Estrutura de Dados Fundamentais Exemplo: Declaração de um Struct endereço que guarda os elementos nome. Teles Lógica e Estrutura de Dados Fundamentais #include <stdio. {. int main() { struct endereco e1. int num. {. // tipo "endereco" compilador // aloca memoria para todos os campos 16 Professor: Eduardo O. Teles 8 . int apt. char cidade[20]. char cidade[20].

. Defina um vetor de empregados para armazenar todos os empregados de sua empresa.h> struct endereco{ char nome[30]. info_end[i]. 18 Professor: Eduardo O. Na função main: crie uma variável que é uma estrutura superior. . i < 100. Após ter concluído o exercício 2.nome). Depois. char cidade[20]. que armazena o nome e idade de um aluno do curso superior.. leia nome e idade do aluno e armazene na variável que você definiu. char estado[3]. char rua[40]. crie uma variável vetor da estrutura superior.. exiba os dados digitados. i++) Printf(“Endereço: %c “. sobrenome. RG. Defina um registro empregado para guardar os dados (nome. Teles Lógica e Estrutura de Dados Fundamentais Evoluindo.18/05/2011 Lógica e Estrutura de Dados Fundamentais #include <iostream. Teles 9 . Criar uma estrutura chamada superior. 17 Professor: Eduardo O. salário) de um empregado de sua empresa. long int cep. data de admissão. {. data de nascimento. // Imprime todos os nomes do vetor for(int i = 0.. exiba na tela o nome e a idade do aluno. main() { struct endereco info_end[100]. O programa deve obter o nome e a idade de 5 alunos.