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



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

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Fundamentos de Programação

INF 1007 Programação II

Estrutura de Dados Básica

Tabela ASCII de caracteres de controle

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Alocação dinâmica de memória

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Programação de Computadores I. Ponteiros

Computação II Orientação a Objetos

INF 1005 Programação I

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Neste artigo estudaremos os conceitos relacionados às matrizes unidimensionais (vetores) e multidimensionais.

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Linguagem de Programação C

Métodos Computacionais. Fila

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Introdução a Computação

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

MC-102 Aula 17 Strings e Matrizes

Plano de Aula. if(condição) { bloco de comandos; } else { bloco de comandos2; }

Reinaldo Gomes Alocação Dinâmica

Curso de C. Memória Dinâmica 17/05/ :33 1

INF 1005 Programação I

Introdução à Programação

Algoritmos e Programação

Trabalho 3: Agenda de Tarefas

Registros. Técnicas de Programação. Rafael Silva Guimarães

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

INTRODUÇÃO À LINGUAGEM C++

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Linguagem de Programação I

Programação: Tipos, Variáveis e Expressões

Universidade Federal de Rondônia Técnicas de Desenvolvimento de Programas Lista 4

INF 1007 Programação II

INF 1620 P1-10/04/02 Questão 1 Nome:

Tipos de Dados Avançados Vetores e Matrizes

Estruturas (Registros)

Linguagens de Programação

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Exercício. 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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Capítulo 2: Introdução à Linguagem C

Curso de C para Engenharias

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Implementando uma Classe e Criando Objetos a partir dela

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

Programando em C++ Histórico da Linguagem C

Primeiro Curso de Programação em C 3 a Edição

Alocação Dinâmica em C

14.1 Vetor - Problemas

Estruturas de Dados Aula 15: Árvores 17/05/2011

Orientação a Objetos. Conceitos Iniciais Introdução a Linguagem Java. Gil Eduardo de Andrade

17 - Funções e Procedimentos em C Programação Modular

Desenvolvimento OO com Java Orientação a objetos básica

Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

Introdução a POO. Introdução a Linguagem C++ e POO

GFM015 Introdução à Computação Linguagem C / Introdução à Modularização de Programas (uso de subprogramas)

Vetores. Vetores. Figura 1 Exemplo de vetor com 10 elementos

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

Programação com Posix Threads

Linguagens de Programação I

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Conceitos básicos da linguagem C

Convertendo Algoritmos para a Linguagem C

Linguagem de Programação

15 a Aula Subprogramação /Subalgoritmos Função e Procedimento

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

5 Apresentando a linguagem C

INF 1007 Programação II

Variáveis e Comandos de Atribuição

3. INTRODUÇÃO À LINGUAGEM C 3.1. CONCEITOS BÁSICOS. Lógica de Programação

INF 1007 Programação II

LTP-IV. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Conversão de Tipos e Arrays

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

LINGUAGEM C. Estrutura básica de um programa

Linguagem e Técnicas de Programação I Tipos de dados, variáveis e constantes. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

Curso de Linguagem C

Ponteiros. Introdução

Transcrição:

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

Tópicos da Aula Hoje aprenderemos a relação entre ponteiros e strings Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros para strings Também veremos como alocar espaço de memória em tempo de execução Conceito de Alocação Dinâmica Importância Funções em C para alocação dinâmica Usando alocação dinâmica para criar vetores e matrizes dinâmicas 2

Ponteiros e Strings Uma string é um vetor de caracteres char s [10] ; Vimos que s representa o endereço inicial do vetor Portanto, podemos manipular strings com ponteiros 3

Ponteiros e Strings ERRADO char capital[7]; capital = Recife"; Tentativa de atribuir endereço da constante Recife à constante capital Declaração da constante do tipo vetor de caracteres capital Já foi atribuido um endereco à constante capital (endereço inicial do vetor) 4

Ponteiros e Strings Declaração da constante do tipo vetor de caracteres capital Vetor de caracteres inicializado com as letras que fazem parte de Recife CORRETO char capital[7] = Recife"; char* cidade; cidade = Recife ; Atribuição do endereço da constante Recife à variável cidade 5

Inicialização de Strings Através de Ponteiros int main() { char *salute= saudacoes ; puts(++salute); return 0; int main() { char salute[] = saudacoes ; puts(++salute); return 0; Estes dois códigos executariam da mesma forma? Imprime audacoes (sem s): ponteiro variável Erro de compilação: tentativa de modificar ponteiro constante 6

Passando Ponteiros para Strings para Funções Na biblioteca string.h, existem várias funções que têm como parâmetros ponteiros para strings Exemplos: char* strcpy(char* dest, char* origem); int strcmp(char* s1, char* s2); Podemos passar como argumentos, tanto ponteiros para strings ou vetores de caracteres(strings) int main() { char *salute= saudacoes ; char saudacao[10]; strcpy(saudacao,salute); return 0; 7

Vetores de Strings x Vetores de Ponteiros para Strings Quando queremos armazenar um conjunto de strings podemos: Usar um vetor de strings Vetor bidimensional (matriz) de caracteres Usar um vetor de ponteiros para strings 8

Usando Vetor de Strings (Matriz de Caracteres) int main(){ Programa verifica se um nome int cont; entrado pelo usuário pertence a um int entra=0; char nome[40]; vetor inicializado de strings char list[4][7]= { Carlos, Ana, Pedro, Andre ; Cuidado para que as printf ( Digite seu nome: ); strings não excedam as gets(nome); colunas da matriz! for (cont=0; cont < 4; cont++){ if (strcmp(list[cont],nome) == 0) entra=1; if (entra == 1) printf ( Você pode entrar. ); else printf ( Você não pode entrar. ); return 0;

Usando Vetores de Ponteiros para Strings int main(){ int cont; int entra=0; char nome[40]; char* list[4]= { Carlos, Ana, Pedro, Andre ; Programa verifica se um nome entrado pelo usuário pertence a um vetor inicializado de ponteiros para strings printf ( Digite seu nome: ); Despreocupação com gets(nome); tamanho das strings for (cont=0; cont < 4; cont++){ if (strcmp(list[cont],nome) == 0) entra=1; if (entra == 1) printf ( Você pode entrar. ); else printf ( Você não pode entrar. ); return 0;

Inicialização de um Vetor de Strings x Vetor de ponteiros para Strings list[0] list[1] list[2] list[3] Versão Vetor de Strings 0 1 2 3 4 5 6 C a r l o s \0 A n a \0 P e d r o \0 A n d r e \0 Desperdício de Memória! list[0] list[1] list[2] list[3] Versão Vetor de Ponteiros C a r l o s \0 A n a \0 P e d r o \0 A n d r e \0 11

int main(){ int cont; int entra=0; char nome[40]; char list[4][10]; for (cont=0; cont < 4; cont++){ printf( \nentre com mais um convidado:\n ); gets(list[cont]); return 0; Outro Exemplo Usando Vetor de Strings Programa pede para o usuário preencher um vetor de strings Cuidado para que as strings não excedam as colunas da matriz!

Outro Exemplo Usando Vetor de Ponteiro de Strings int main(){ int cont; int entra=0; char nome[40]; char* list[4]; for (cont=0; cont < 4; cont++){ printf( \nentre com mais um convidado:\n ); gets(list[cont]); Programa pede para o usuário prencher um vetor de ponteiro para strings ERRADO! Tenta armazenar string em endereço (INVÁLIDO) apontado por list[cont]

Alocação de Memória Quando declaramos uma variável, o compilador reserva (aloca) um espaço na memória suficiente para armazenar valores do tipo da variável Alocação estática (em tempo de compilação) int var ; char s1 [10]; char* s2; Aloca espaço para 1 int Aloca espaço para 10 char Aloca espaço para 1 endereço 14

Modos de alocar espaço em memória: Estaticamente Variáveis globais (e estáticas): O espaço reservado para a variável existe enquanto o programa estiver sendo executado Variáveis locais: O espaço existe enquanto a função, que declarou a variável, estiver sendo executada. Dinamicamente Alocação Dinâmica Requisitar memória em tempo de execução: O espaço alocado dinamicamente permanece reservado até que seja explicitamente liberado pelo programa 15

Alocação Dinâmica em C Função básica para alocar memória é malloc presente na biblioteca stdlib.h void* malloc(unsigned qtdbytes); Recebe como argumento um número inteiro sem sinal que representa a quantidade de bytes que se deseja alocar Retorna o endereço inicial da área de memória alocada. 16

Alocação Dinâmica em C com malloc Aloca somente a quantidade de memória necessária Exemplo: int *v ; v = malloc (10 * 4) ; Se a alocação for bem sucedida, v armazenará o endereço inicial de uma área contínua de memória suficiente para armazenar 10 valores inteiros (4O bytes) 17

Alocação Dinâmica em C com malloc Uso do comando sizeof para ter independência de plataforma de desenvolvimento Exemplo: int *v ; v = malloc(10 * sizeof (int)) ; Função malloc retorna um ponteiro genérico, para qualquer tipo, representado por *void Faz-se a conversão para o tipo apropriado usando o operador de molde de tipo (cast) v = (int *) malloc(10 * sizeof(int)); 18

Erro na Alocação Se não houver espaço livre suficiente para realizar a alocação, a função malloc retorna um endereço nulo É representado pelo símbolo NULL É uma boa prática de programação testar se a alocação foi bem sucedida para evitar erros de execução 19

Liberando Espaço Alocado Uso da função free para liberar espaço de memória alocada dinamicamente void free(void* endereco); Recebe como parâmetro o ponteiro da memória a ser liberada O espaço de memória fica livre para ser alocado futuramente pelo próprio programa ou outro programa Recomenda-se liberar espaço de memória previamente alocado que não é mais necessário Evita desperdício 20

Memória e Alocação Dinâmica 1) Declaração: int *v ; Abre-se espaço na pilha para o ponteiro (variável local) Código do programa 2) v=(int*)malloc(10*sizeof (int)); Reserva-se o espaço de memória da área livre e atribui o endereço à v Código do programa Variáveis Globais e Estáticas Memória livre Variáveis Globais e Estáticas 40 bytes Memória livre 504 v - v 504 21

Usando Alocação Estática para Calcular Média com Vetores #include <stdio.h> int main() { int qtdnumeros,contador = 0; float numeros[2000]; float media = 0.0; do{ printf( Quantidade de numeros? (< 2000):\n ); scanf( %d, &qtdnumeros); while (qtdnumeros <= 0 qtdnumeros > 2000); while (contador < qtdnumeros) { scanf( %f,&numeros[contador]); media = media + numeros[contador]; contador++; media = media/qtdnumeros; printf( \na media eh %f\n ); return 0; Declaração estática do tamanho do vetor limita aplicação Tamanho pode ser insuficiente ou grande demais (desperdício) 22

Vetores Dinâmicos Declaração de vetores implicam em alocação estática de memória Com alocação dinâmica, podemos criar algo como um vetor cujo tamanho é decidido em tempo de execução, ou seja um vetor dinâmico Para tal, usaremos variáveis do tipo ponteiro que receberão os endereços iniciais do espaço alocado dinamicamente Com o endereço inicial, podemos navegar pelo vetor 23

int main() { int qtdnumeros,contador = 0; float* numeros; float media = 0.0; do{ Usando Alocação Dinâmica para Calcular Média com Vetores Dinâmicos Ponteiro recebe endereço de espaço alocado dinamicamente (vetor dinâmico) printf( Quantidade de numeros?:\n ); scanf( %d, &qtdnumeros); while (qtdnumeros <= 0); numeros = (float*) malloc(qtdnumeros*sizeof(float)); if (numeros!= NULL) { while (contador < qtdnumeros) { scanf( %f,&numeros[contador]); media = media + numeros[contador]; contador++; /* continua */ Tamanho do vetor é determinado pelo usuário 24

Função Realloc Podemos mudar o espaço de memória alocado previamente de forma dinâmica Para isso, podemos utilizar a função realloc void* realloc(void* ptr,unsigned qtdbytes); Recebe endereço do bloco de memória alocado previamente Recebe como argumento um número inteiro sem sinal que representa a quantidade de bytes que se deseja alocar Retorna o endereço inicial da área de memória alocada Se endereço retornado for diferente do passado como parâmetro, conteúdo do bloco original é copiado para novo endereço 25

Usando Realloc int main() { int qtdnumeros = 5,contador = 0; char resposta; float media = 0.0; float* nums; nums = (float*) malloc(qtdnumeros*sizeof(float)); if (nums == NULL) { printf( Memoria insuficiente );exit(1); printf( Programa calcula media de 5 numeros. ); printf( Deseja mais/menos? (s/n)\n ); scanf( %c,&resposta); if (resposta == s ) { do { printf( Quantidade de numeros?:\n ); scanf( %d, &qtdnumeros); while (qtdnumeros <= 0); Vetor é alocado dinamicamente Tamanho do vetor muda dinamicamente nums = (float*) realloc(nums,qtdnumeros*sizeof(float)); /* continua */ 26

Vetores e Alocação Dinâmica Vetores Locais e Funções float* prod_vetorial (float* u, float* v) { float p[3] ; p[0] = u [ 1 ] * v [ 2 ] v [ 1 ] * u [ 2 ] ; p[1] = u [ 2 ] * v [ 0 ] v [ 2 ] * u [ 0 ] ; p[2] = u [ 0 ] * v [ 1 ] v [ 0 ] * u [ 1 ] ; return p ; ERRADO! Endereço local é retornado A variável retornada é declarada localmente. Por isso, sua área de memória deixa de ser válida quando a função termina. 27

Vetores e Alocação Dinâmica Vetores Locais e Funções Forma Correta: float* prod_vetorial (float* u, float* v) { float* p = (float*) malloc(3 * sizeof(float)) ; p[0] = u [ 1 ] * v [ 2 ] v [ 1 ] * u [ 2 ] ; p[1] = u [ 2 ] * v [ 0 ] v [ 2 ] * u [ 0 ] ; p[2] = u [ 0 ] * v [ 1 ] v [ 0 ] * u [ 1 ] ; return p ; CERTO! Endereço alocado dinamicamente fica disponível até que seja liberado explicitamente 28

Criando Matrizes Dinâmicas Deve-se usar um ponteiro para ponteiro int** matriz; Pode-se pensar em uma matriz dinâmica como um vetor de ponteiros Cada elemento do vetor contém o endereço inicial de uma linha da matriz (vetor-linha) Para alocar uma matriz com malloc, é preciso fazer a alocação do vetor de ponteiros e, em seguida, de cada vetor-linha Da mesma forma, a liberação da memória é feita em partes 29

Ponteiro para ponteiro 30

Representando Matrizes Dinâmicas na Memória int** m; Memória Matriz m 6 10 7 11 m 100 107 106 105 104 103 102 101 100 408 300 408 300 7 6 412 304 11 Vetor Linha 10 Ponteiro (endereço inicial do vetor linha) 31

Alocando uma Matriz Dinâmica int main () { int linhas, colunas,i,j; printf( Numero de linhas e colunas da matriz:\n"); scanf("%d %d",&linhas,&colunas); float** mat ; mat = (float**) malloc(linhas * sizeof(float*)); for (i = 0 ; i< linhas ; i++) { mat[i]= (float*) malloc(colunas * sizeof(float)) ; printf("\n Digite os elementos da matriz:\n"); for(i=0; i< linhas; i++) { for(j=0; j< colunas; j++) { printf("elemento [%d][%d] = ",i,j); scanf("%f",&mat[i][j]); printf("\n"); /* continua */ Alocando vetores-linha Alocando vetor de ponteiros

Liberando uma Matriz Dinâmica void liberamatriz (int** mat, int linhas) { int i,j; for(i=0; i< linhas; i++) { free(mat[i]); Libera primeiro free(mat); cada vetor linha Libera depois vetor de ponteiros

Passando Matrizes Dinâmicas como Argumentos void imprimematriz(int linhas, int** mat) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ printf("%d ",mat[i][j]); printf("\n"); Acesso usando notação de ponteiro: *(*(mat+i)+j) Parâmetro do tipo ponteiro para ponteiro de int

Cuidado na Assinatura da Função void imprimematriz(int linhas, int** mat) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ int main() { printf("%d ",mat[i][j]); printf("\n"); int matriz[][2] = {{6,10,{7,11; imprimematriz(2,matriz); return 0; Erro de Execução! Parâmetro do tipo ponteiro de ponteiro de int Endereço da matriz estática passada como argumento

Cuidado na Assinatura da Função void imprimematriz(int linhas, int mat[][2]) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ int main() { printf("%d ",mat[i][j]); printf("\n"); int matriz[][2] = {{6,10,{7,11; imprimematriz(2,matriz); return 0; Certo! Parâmetro do tipo vetor de vetores de tamanho 2 de int Parâmetro deve indicar número de colunas

Resumindo... Relação entre ponteiros e strings Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros para strings Alocação Dinâmica Uso Funções em C para alocação dinâmica Usando alocação dinâmica para criar vetores e matrizes dinâmicas 37