Programação de Computadores I – Ponteiros

Slides:



Advertisements
Apresentações semelhantes
TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS ESTRUTURAS DE DADOS AVANÇADAS Aula /08/2011 Professor Leomir J. Borba-
Advertisements

Programação II Estruturas de Dados
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
LPG-I: Tipos Complexos - Estruturas
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Vetor de Ponteiros Exemplo de Alocação. Escrever Vetor de Vetores de floats int main() { int i, k, n; float **vetor; // vetor de vetores int *tamanho;
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Definição de Tipos Estruturas e Ponteiros
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Prof. Ricardo Santos PONTEIROS
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Programação de Computadores I – Arquivos
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Programação de Computadores I – Ponteiros Profa. Mercedes Gonzales Márquez.
Linguaguem de Programação II
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Programação de Computadores I – Arquivos Profa. Mercedes Gonzales Márquez.
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
INE5408 Estruturas de Dados Ponteiros, passagem de parâmetros e modelos de memória.
INE5408 Estruturas de Dados Alocação Dinâmica de Memória.
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Alocação Dinâmica de Memória.
Linguagens de Programação Conceitos e Técnicas Expressões Prof. Isabel Cafezeiro
Estrutura de Dados (DPADF 0056) Aula 7 – Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Algoritmos e Estruturas de Dados I – Ponteiros Profa. Mercedes Gonzales Márquez.
Estruturas de Dados Aula 2: Estruturas Estáticas
VARIÁVEIS EM C Dilvan Moreira.
INF1007: Programação 2 3 – Cadeias de Caracteres
Fundamentos de Programação 1
INF1007: Programação 2 2 – Alocação Dinâmica
INE5408 Estruturas de Dados
INE5408 Estruturas de Dados
INF1007: Programação 2 5 – Tipos Estruturados
INF1007: Programação 2 1 – Ponteiros
Fundamentos de Programação 1
Estrutura de Dados Revisão
PCI- Estruturas de Controle
INF1007: Programação 2 9 – Tipos Abstratos de Dados
FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO
Fundamentos de Programação 1
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
Algoritmos e Estruturas de Dados I – Ponteiros
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTO DE PROGRAMAÇÃO
Programação de Computadores I – Arquivos
FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO
UNIDADE 7 Tipos estruturados
aritmética de ponteiros
INE 5201 – INTRODUÇÃO À CIÊNCIA DA COMPUTAÇÃO
Algoritmos e Programação MC102
Listas Encadeadas.
Fundamentos de Programação 1
Relembrando... Variáveis : endereçam uma posição de memória que contem um determinado valor dependendo do seu tipo (char, int, float, double, ...) void.
Linguagem de Programação Aplicações Avançadas de Microprocessadores
Programação de Computadores I – Arquivos
DHD – Desenvolvimento em Hardware
Programação de Computadores I – Ponteiros
DHD – Desenvolvimento em Hardware
Linguagem C Linguagem Imperativa
Computação Eletrônica Vetores e Matrizes
Algoritmos e Estruturas de Dados I – Ponteiros
Linguagem C Linguagem Imperativa
DHD – Desenvolvimento em Hardware
Programação de Computadores LINGUAGEM C – AULA 03 – PROF. WELLINGTON TELLES.
DHD – Desenvolvimento em Hardware
Fundamentos de Programação 1
parâmetros e modelos de memória
Transcrição da apresentação:

Programação de Computadores I – Ponteiros Profa. Mercedes Gonzales Márquez

Ponteiros - Manipulação Declaração: <tipo> *<identificador> int *p; float *q; O operador unário & captura o endereço de um objeto. p = &x; O operador unário * é um operador de indireção: quando aplicado a um apontador, acessa o conteúdo do objeto apontado. x = *p;

Ponteiros - Manipulação int vet[4]; vet aponta para vet[0] (vet[0]==*vet) e - vet+1 aponta para vet[1] e *(vet+1) refere-se ao conteúdo de vet[1] – vet+i aponta para vet[i] e *(vet+i) refere-se ao conteúdo de vet[i]

Ponteiros - Manipulação int vet[4]; int *pa; pa = &vet[0]; pa vet Se pa aponta para vet[0], então: - pa+1 aponta para vet[1] e pa+i aponta para vet[i].

Aritmética de ponteiros Todas as operações sobre ponteiros levam em conta o tamanho do tipo apontado . Operações válidas de ponteiros: Atribuição entre ponteiros do mesmo tipo Adição/Subtração entre um ponteiro e um inteiro. Comparação entre dois ponteiros que apontam a elemntos do mesmo array. Subtração entre dois ponteiros que apontam a elementos do mesmo array. Atribuição ou comparação com zero (NULL)

Aritmética de Ponteiros Incremento/decremento: Se p é um ponteiro a tipo T, p++ incrementa o valor de p em sizeof(T) (onde sizeof(T) é a quantidade de armazenagem necessária para um dado de tipo T). Similarmente, p-- decrementa p em sizeof(T); T tab[N]; T * p; int i; p=&tab[i]; p++; // p contem o endereço de tab[i+1];

Aritmética de Ponteiros Adição/subtração com um inteiro: Se p é um ponteiro a tipo T e n é um inteiro, p+n incrementa o valor de p em n*sizeof(T). Similarmente, p-n decrementa p em n*sizeof(T); T tab[N]; T * p; p=tab; p=p+n; // p contem o endereço de tab[n];

Aritmética de Ponteiros Comparação de dois ponteiros. Se p e q aponta a membros do mesmo array, então são válidas as relações como ==, !=, <, >=, etc. Por exemplo, p<q é verdade se p aponta a um elemento anterior do array que q aponta. Subtração de ponteiros: Se p e q apontam a elementos do mesmo array, e p<q, então q-p+1 é o número de elementos de p até q inclusive. O comportamento é indefinido para aritmética ou comparação com ponteiros que não apontam a membros do mesmo array.

Examplo de subtração de ponteiros /* strlen: returna o comprimento da string s */ int strlen(char *s){ char *p = s; while (*p != '\0') p++; return p - s; }

Ponteiros e strings char a[] = “aprendendo ponteiros"; /* um array */ char *p = “aprendendo ponteiros"; /* um ponteiro */ a aprendendo ponteiros\0 p aprendendo ponteiros\0 a é um array, apenas do tamanho suficiente para armazenar a sequência de caracteres e '\0. p é um ponteiro inicializado para apontar uma string constante;

Ponteiros - Exercícios int x=3, y=5, *p=&x, *q=&y, *r; double z; Expressão Valor p==&x 1 **&p 3 r=&z erro 7**p/*q+7 11 *(&y)*=*p 15

Ponteiros Exemplo O que será impresso pelo programa abaixo considerando que os valores lidos nas variáveis x e y sejam 2 e 5,respectivamente?

Ponteiros Exemplo O que será impresso pelo programa abaixo considerando que os valores lidos nas variáveis x e y sejam 2 e 5,respectivamente?

Ponteiros Exemplo O que faz o trecho de programa abaixo?

Ponteiros para registros Ao criarmos uma variável de um tipo struct, esta e armazenada na memoria como qualquer outra variável, e portanto possui um endereço. Exemplo #include <stdio.h> typedef struct { double x; double y; } Coordenada; int main(){ Coordenada c1, c2, *c3; c3 = &c1; ......

Ponteiros para registros Para acessarmos os campos de uma variavel struct via um ponteiro, podemos utilizar o operador * juntamente com o operador . como de costume: Coordenada c1, *c3; c3 = &c1; (*c3).x = 1.5; (*c3).y = 1.5; Em C também podemos usar o operador -> para acessar campos de uma estrutura via um ponteiro. Podemos obter o mesmo resultado do exemplo anterior: c3->x = 1.5; c3->y = 1.5;

Ponteiros para registros Resumindo: Para acessar campos de estruturas via ponteiros use um dos dois: ponteiroEstrutura->campo (*ponteiroEstrutura).campo Exercício 1: Vamos criar as seguinte funcões: void leCoordenada3D(Coordenada3d *f);: lê dados de uma ponto no espaço tridimensional com coordenadas (x,y,z) passada como ponteiro. (Por quê como ponteiro?) void imprimeCoordenada3D(Coordenada3d f); Imprime coordenadas de um ponto. O programa principal que requeira a leitura de 5 pontos no espaço tridimensional.

Ponteiros para registros Coordenada3d ProdutoEscalar(Coordenada3d v1,Coordenada3d v2) onde produto_escalar=<v1,v2>=v1.x*v2.x+v1.y*v2.y

Alocação dinámica função malloc – Parâmetro: tamanho desejado, em bytes – Resultado: apontador para espaço na memória Programa int *p; p = (int*)malloc(4); *p = 5; printf("%d", *p);

Alocação dinámica função free: – Parâmetro: endereço já alocado – Resultado: libera a área alocada Programa int *p; p = (int*)malloc(4); *p = 5; free(p);

Alocação dinámica função sizeof: sizeof(variavel) – Retorna quantidade de memória ocupada pela variável sizeof(tipo) – Retorna quantidade de memória ocupada por uma variável com este tipo. VETOR DINÂMICO • Calcular tamanho do vetor com sizeof • Reservar memória com malloc • Acessar elementos com [ ] ou ponteiros • Liberar memória do vetor com free

Alocação dinámica Exemplo: Alocação dinámica de um vetor #include <stdio.h> #include <stdlib.h> int main(void) { int n; int * vet; int i; printf("Input number of elements: \n"); scanf("%d", &n); if ((vet=(int *)malloc(n * sizeof(int)))==NULL) { printf(“Erro de alocação de memoria !\n"); exit(1); } for (i=0; i<n; i++) scanf("%d", &vet[i]); printf("%d ", vet[i]); free(vet);

Alocação dinámica de strings void main(void) { char sir1[40]; char *sir2; printf(“Informe uma string: \n"); scanf("%40s", sir1); if ((sir2=(char *)malloc(strlen(sir1)+1))==NULL) { printf(“Erro na alocação de memória !\n"); exit(1); } strcpy(sir2, sir1); printf(“A cópia e: %s \n", sir2); ..........

Alocação dinámica Exercício 2. O exercício 1 pedia para ingressar 5 pontos do espaço tridimensional, agora considere um vetor de pontos de tamanho dinâmico.

Exercícios Exercício 3. O que será impresso pelo programa abaixo: #include <stdio.h> typedef struct{ int x; int y; } T; void f1(T *a){ f2(&(a->x)); f2(&(a->y)); } void f2(int *b){ *b = 2*(*b); int main(){ T a, b, *c, *d; c = &a; a.x = 2; a.y = 4; b.x = 2; b.y = 2; d = c; f1(d); b = *d; printf("x: %d --- y: %d\n",b.x,b.y); 7. Escreva

Exercícios int main(){ T a, b, *c, *d; c = &a; a.x = 2; a.y = 4; b.x = 2; b.y = 2; d = c; f1(d); b = *d; printf("x: %d --- y: %d\n",b.x,b.y); }

Função que retorna um ponteiro int * soma_vetor4(int *a, int *b, int n) { int * r; r=(int *) malloc(sizeof (int) * n); if (r==NULL) exit(1); int i; for (i=0; i<n; i++, a++, b++) r[i]=*a+*b; return r; } … int a[3]={1,2,3}; int b[3]={4,5,6}; int * rr; rr=soma_vetor4(a,b,3); imprime_vetor(rr,3);