Programação Estruturada

Documentos relacionados
Linguagem C ponteiros

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Introdução à Programação

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Ponteiros e Alocação de Memória

Ponteiros e Tabelas. K&R: Capítulo 5

Ponteiros. Baseado nos slides do Prof. Mauro.

INF 1007 Programação II

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Aula 18: Funções em C

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Programação Estruturada

Introdução. Ponteiros

ponteiros INF Programação I Prof. Roberto Azevedo

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Computação 2. Aula 7. Profª. Fabiany Ponteiros

3. Linguagem de Programação C

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

1 Exercícios com ponteiros

Aula 17: Ponteiros e Alocação Dinâmica em C

INF 1007 Programação II

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Introdução a Programação de Jogos

Programação de Computadores II. Cap. 5 Vetores

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

O que é um apontador em C (type pointer in C)?

Aula 24 Ponteiros, vetores e structs

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Alocação Dinâmica em C

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

ESTRUTURA DE DADOS (TCC )

Aula 08: Funções (Parte II)

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Linguagem C. Ponteiros. Alex Vidigal Bastos.

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

char *strchr (const char *str, int ch);

prim = A ; prim = &A[0];

Linguagem C: funções e ponteiros. Prof. Críston Algoritmos e Programação

Escopo das Variáveis. Funções. Funções. Funções. Funções. Algoritmos e Lógica de Programação. Programação Estruturada Funções Recursividade

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Vetores e Matrizes. Conceito. Conceito. Conceito. Conceito. Conceito. Variáveis Compostas Homogêneas. Matriz

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Programação: Vetores

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Estruturas de Dados Homogêneas (Vetores e Matrizes) e Ponteiros em C

Linguagem C vetores. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Ponteiros. Considere um carteiro recém-chegado na vila Na vila, a referência para se encontrar a casa é pelo morador

Estruturas Dinâmicas - Ponteiros Parte I

Alocação Dinâmica de Memória

Introdução à Computação

char *strchr (const char *str, int ch);

Tipos Abstratos de Dados. Estrutura de Dados

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Introdução a Computação

Declarando e Utilizando Ponteiros. Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

Funções em Linguagem C Parte II

Programação Estruturada

Módulo 5 Vetores e Alocação Dinâmica

Básico: estrutura de programa, sintaxe Interface com linha de comando

Algoritmos e Estruturas de Dados I (AEDI) Introdução - AEDI. Prof. Paulo Henrique Pisani

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

11a. Aula Ponteiros e Vetores

Aula 03: Introdução a C

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

MC-102 Aula 10 Vetores

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Programação II. Ponteiros. Bruno Feijó Dept. de Informática, PUC-Rio

Aula 25: Alocação Dinâmica

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Aula 20 - Ponteiros. Prof. Laura Silva de Assis. Engenharia de Computação. CEFET/RJ - Centro Federal de Educação Tecnológica Celso Suckow da Fonseca

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

EXERCÍCIO DE SONDAGEM TURMA 02 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

DAS5102 Fundamentos da Estrutura da Informação

Linguagem C: Introdução

Aula 24: Ponteiros e Alocação Dinâmica

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Programação de Computadores II

ED1 - Aula 01 Introducao e revisão

Carlos Eduardo Batista. Centro de Informática - UFPB

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Aula 15: Vetores e Matrizes em C

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Transcrição:

Programação Estruturada Ponteiros Parte 1 Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC

Ponteiros

Ponteiro Ponteiros são tipos especiais de dados que armazenam endereços de memória. Uma variável do tipo ponteiro deve ser declarada da seguinte forma: 1 tipo *nome_variável; A variável ponteiro armazenará um endereço de memória de uma outra variável do tipo especificado. Exemplo: 1 int *mema; float *memb; mema armazena um endereço de memória de variáveis do tipo int. memb armazena um endereço de memória de variáveis do tipo float. 1

Operadores de Ponteiro Existem dois operadores relacionados aos ponteiros: O operador & retorna o endereço de memória de uma variável: 1 int *mema; 2 int a = 90; 3 mema = &a; O operador * acessa o conteúdo do endereço indicado pelo ponteiro: 1 printf("%d", *mema); mema a 1024 90 end = 1024 2

Operadores de Ponteiro 1 #include <stdio.h> 2 3 int main(void) { 4 int b; 5 int *c; 6 7 b = 10; 8 c = &b; 9 *c = 11; 10 printf("%d\n", b); 11 } O que será impresso? 3

Operadores de Ponteiro 1 #include <stdio.h> 2 3 int main(void) { 4 int num, q = 1; 5 int *p; 6 7 num = 100; 8 p = &num; 9 q = *p; 10 11 printf("%d\n", q); 12 } O que será impresso? 4

Cuidado 1! Não se pode atribuir um valor para o endereço apontado pelo ponteiro sem antes ter certeza de que o endereço é válido: 1 int a, b; 2 int *c; 3 4 b = 10; 5 *c = 13; /* Vai armazenar 13 em qual endereço? */ O correto seria por exemplo: 1 int a, b; 2 int *c; 3 4 b = 10; 5 c = &a; 6 *c = 13; 5

Cuidado 2! Infelizmente o operador * de ponteiros é igual ao da multiplicação. Portanto preste atenção em como utilizá-lo. 1 #include <stdio.h> 2 3 int main() { 4 int b, a; 5 int *c; 6 b = 10; 7 c = &a; 8 *c = 11; 9 a = b * c; 10 printf("%d\n", a); 11 return 0; 12 } Ocorre um erro de compilação pois o * é interpretado como operador de ponteiro sobre c e não de multiplicação. 6

Cuidado 2! O correto seria algo como: 1 #include <stdio.h> 2 3 int main(void) { 4 int b, a; 5 int *c; 6 7 b = 10; 8 c = &a; 9 *c = 11; 10 a = b * (*c); 11 printf("%d\n", a); 12 } 7

Cuidado 3! O endereço que um ponteiro armazena é sempre de um tipo específico. 1 #include <stdio.h> 2 3 int main() { 4 double b, a; 5 int *c; 6 b = 10.89; 7 c = &b; /* Ops! c é ponteiro para int e n~ao double */ 8 a = *c; 9 printf("%lf\n", a); 10 return 0; 11 } Além do compilador alertar que a atribuição pode causar problemas, é impresso um valor totalmente diferente de 10.89. 8

Operações com ponteiros Podemos comparar ponteiros ou o conteúdo apontado por eles: 1 int main() { 2 double *a, *b, c, d; 3 b = &c; 4 a = &d; 5 6 if (b < a) 7 printf("o endereco apontado por b eh menor: %p e %p\n", b, a); 8 else if (a < b) 9 printf("o endereco apontado por a eh menor: %p e %p\n", a, b); 10 else if (a == b) 11 printf("mesmo endereco"); 12 13 if (*a == *b) 14 printf("mesmo conteudo: %lf\n", *a); 15 return 0; 16 } Notem que para imprimir um ponteiro usamos %p. 9

O valor NULL Quando um ponteiro não está associado com nenhum endereço válido é comum atribuir o valor NULL para este. Isto é usado em comparações com ponteiros para saber se um determinado ponteiro possui valor válido ou não. O que é impresso se fizermos: printf("%p\n", NULL);? 1 int main() { 2 double *a = NULL, *b = NULL, c = 5; 3 a = &c; 4 if (a!= NULL) { 5 b = a; 6 printf("numero: %lf\n", *b); 7 } 8 return 0; 9 } 10

Passagem de Parâmetros por Valor e por Referência

Passagem de parâmetros Quando passamos argumentos para uma função, os valores fornecidos são copiados para as variáveis parâmetros da função. Este processo é idêntico a uma atribuição. Este processo é chamado de passagem por valor. Desta forma, alterações nos parâmetros dentro da função não alteram os valores que foram passados na chamada da função: 1 int main() { 2 int a = 4, b = 5; 3 nao_troca(a, b); 4 return 0; 5 } 6 void nao_troca(int x, int y) { 7 int aux; 8 aux = x; 9 x = y; 10 y = aux; 11 } 11

Passagem de argumentos por referência Em C só existe passagem de parâmetros por valor. Em algumas linguagens existem construções para se passar parâmetros por referência. Neste último caso, alterações de um parâmetro passado por referência também ocorrem onde foi feita a chamada da função. No exemplo anterior, se x e y fossem passados por referência, seus conteúdos seriam trocados. 12

Passagem de argumentos por referência Podemos obter algo semelhante em C utilizando ponteiros. O artifício corresponde em passar como argumento para uma função o endereço da variável, e não o seu valor. Desta forma podemos alterar o conteúdo da variável como se fizéssemos passagem por referência. 1 #include <stdio.h> 2 void troca(int *a, int *b); 3 int main() { 4 int x = 4, y = 5; 5 troca(&x, &y); 6 printf("x = %d e y = %d\n", x, y); 7 return 0; 8 } 9 void troca(int *a, int *b) { 10 int aux; 11 aux = *a; 12 *a = *b; 13 *b = aux; 14 } 13

Passagem de argumentos por referência O uso de ponteiros para passar parâmetros que devem ser alterados dentro de uma função é útil em certas situações como: Funções que precisam retornar mais do que um valor. Suponha que queremos criar uma função que recebe um vetor como parâmetro e precisa retornar o maior e o menor elemento do vetor. Mas uma função só retorna um único valor! Podemos passar ponteiros para variáveis que receberão o maior e menor elemento. 14

Passagem de argumentos por referência 1 #include <stdio.h> 2 void maxandmin(int vet[], int tam, int *min, int *max); 3 int main() { 4 int v[] = {10, 80, 5, -10, 45, -20, 100, 200, 10}; 5 int min, max; 6 maxandmin(v, 9, &min, &max); 7 printf("o menor eh: %d\no maior eh: %d\n", min, max); 8 return 0; 9 } 10 void maxandmin(int vet[], int tam, int *min, int *max) { 11 int i; 12 *max = vet[0]; 13 *min = vet[0]; 14 for (i = 0; i < tam; i++) { 15 if (vet[i] < *min) 16 *min = vet[i]; 17 if (vet[i] > *max) 18 *max = vet[i]; 19 } 20 } 15

Explicando o scanf Finalmente sabemos o porquê do & no scanf: 1 #include <stdio.h> 2 3 int main() { 4 int x; 5 int *p; 6 7 scanf("%d", &x); 8 scanf("%d", &p); /* ERRO! */ 9 10 p = &x; 11 scanf("%d", p); 12 return 0; 13 } 16

Ponteiros e Vetores

Ponteiros e Vetores Quando declaramos uma variável do tipo vetor, é alocada uma quantidade de memória contigua cujo tamanho é especificado na declaração (e também depende do tipo do vetor). 1 int v[3]; /* Ser~ao alocados 3*4 bytes de memória. */ Uma variável vetor, assim como um ponteiro, armazena um endereço de memória: o endereço de início do vetor. 1 int v[3] = {10, 20, 30}; v 548 10 20 30 ende:548 Quando passamos um vetor como argumento para uma função, seu conteúdo pode ser alterado dentro da função pois estamos passando na realidade o endereço inicial do espaço alocado para o vetor. 17

Ponteiros e Vetores 1 #include <stdio.h> 2 3 void zeravet(int vet[], int tam) { 4 int i; 5 for (i = 0; i < tam; i++) 6 vet[i] = 0; 7 } 8 9 int main() { 10 int vetor[] = {1, 2, 3, 4, 5}; 11 int i; 12 zeravet(vetor, 5); 13 for (i = 0; i < 5; i++) 14 printf("%d, ", vetor[i]); 15 return 0; 16 } 18

Ponteiros e Vetores Tanto é verdade que uma variável vetor possui um endereço, que podemos atribuí-la para uma variável ponteiro: 1 int a[] = {1, 2, 3, 4, 5}; 2 int *p; 3 p = a; E podemos então usar p como se fosse um vetor: 1 for (i = 0; i < 5; i++) 2 printf("%d\n", p[i]); 19

Ponteiros e Vetores: Diferenças! Uma variável vetor, diferentemente de um ponteiro, possui um endereço fixo. Isto significa que você não pode tentar atribuir um endereço para uma variável do tipo vetor. 1 #include <stdio.h> 2 int main() { 3 int a[] = {1, 2, 3, 4, 5}; 4 int b[5], i; 5 b = a; 6 for (i = 0; i < 5; i++) 7 printf("%d", b[i]); 8 return 0; 9 } Ocorre erro de compilação! 20

Ponteiros e Vetores: Diferenças! Mas se b for declarado como ponteiro não há problemas: 1 #include <stdio.h> 2 int main() { 3 int a[] = {1, 2, 3, 4, 5}; 4 int *b, i; 5 b = a; 6 for (i = 0 ; i < 5; i++) 7 printf("%d, ", b[i]); 8 return 0; 9 } 21

Ponteiros e Vetores: Diferenças! O que será impresso pelo programa abaixo? 1 #include <stdio.h> 2 int main() { 3 int a[] = {1, 2, 3, 4, 5}; 4 int *b, i; 5 6 b = a; 7 printf("conteudo de b: "); 8 for (i = 0; i < 5; i++) { 9 printf("%d, ", b[i]); 10 b[i] = i*i; 11 } 12 printf("\nconteudo de a: "); 13 for (i = 0; i < 5; i++) { 14 printf("%d, ", a[i]); 15 } 16 printf("\n"); 17 return 0; 18 } 22

Extra Os argumentos do programa Muitos programas recebem argumentos/parâmetros diretamente na linha de comando Exemplos: ls -ah, unzip NomeDoArquivo, cp ArqOrigem ArqDestino,... Os argumentos de um programa são recebidos como parâmetros da função main. 1 int main(int argc, char *argv[]) { 2... 3 } argc Argument count Número de argumentos do seu programa Sempre há pelo menos 1, que é o nome do seu programa argv Argument values Vetor de tamanho argc de ponteiros para os argumentos do programa (strings) 23

Extra Os argumentos do programa Exemplo 1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) { 4 int i; 5 printf("o programa recebeu %d argumentos\n", argc); 6 for (i = 0; i < argc; i++) 7 printf("\targumento %d: %s\n", i, argv[i]); 8 return 0; 9 } 24

Exercícios

Exercício 1 O que será impresso? 1 #include <stdio.h> 2 3 int main() { 4 int a = 3, b = 2, *p = NULL, *q = NULL; 5 6 p = &a; 7 q = p; 8 *q = *q + 1; 9 q = &b; 10 b = b + 1; 11 12 printf("%d\n", *q); 13 printf("%d\n", *p); 14 return 0; 15 } 25

Exercício 2 Escreva uma função strcat que recebe como parâmetro 3 strings: s1, s2, e sres. A função deve retornar em sres a concatenação de s1 e s2. Obs: O usuário desta função deve tomar cuidado para declarar sres com espaço suficiente para armazenar a concatenação de s1 e s2! 26