Programação de Computadores II

Documentos relacionados
Programação de Computadores II

Programação de Computadores II Lista de Exercícios 03

Ponteiros e Alocação de Memória

Reinaldo Gomes 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

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Linguagem C: Ponteiros - Alocação Dinâmica

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

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

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

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

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

Gilberto A. S. Segundo. 24 de agosto de 2011

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

Alocação Dinâmica. Túlio Toffolo BCC202 Aula 02 Algoritmos e Estruturas de Dados I

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Aula 25: Alocação Dinâmica

DAS5102 Fundamentos da Estrutura da Informação

BCC202 - Estrutura de Dados I

Ponteiros. Baseado nos slides do Prof. Mauro.

Programação Computacional Aula 16: Alocação Dinâmica de Memória

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

Estruturas dinâmicas Ponteiros

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Alocação Dinâmica de Memória

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

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Princípios de Desenvolvimento de Algoritmos MAC122

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

Ponteiros. prof. Fabrício Olivetti de França

Alocação Dinâmica de Memória. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

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

Ponteiros. Introdução e Alocação Dinâmica

Algoritmos e Estruturas de dados

Estruturas Dinâmicas - Ponteiros

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

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

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

Alocação Dinâmica em C

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

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

Alocação Dinâmica em C

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

Aula 24 Ponteiros, vetores e structs

Curso de Programação C em Ambientes Linux Aula 05

Linguagem C Apontadores. Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica

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

Laboratório de Introdução à Ciência da Computação I

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

Tipos Abstratos de Dados. Estrutura de Dados

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

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

Métodos Computacionais. Tipos Estruturados

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Instituto Federal da Bahia Análise e Desenvolvimento de Sistemas INF029 Laboratório de Programação Aula 03: Ponteiros

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

USP-ICMC-BInfo. Ponteiros em C. SCC501 - ICC-II 2011 Prof. João Luís

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

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

INF 1007 Programação II

INF 1620 P4 11/12/06 Questão 1 Nome:

INF 1620 P2-14/10/05 Questão 1 Nome:

Professora Jeane Melo

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Introdução a Programação. Ponteiros para Estruturas, Outros Tipos de Estruturas

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

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

INF 1620 P4-01/07/08 Questão 1 Nome:

Exercícios sobre textos; Alocação dinâmica.

Introdução à Computação

1 Exercícios com ponteiros

Ponteiros. Embora o programador não tenha acesso ao endereço de uma variável, existem algumas situações onde é necessário a utilização deste endereço.

Alocação Dinâmica de Memória. Programação II

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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Ponteiros e Alocação Dinâmica em C. Fonte: DCC UFMT (modificado)

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

1 Exercícios com ponteiros

Programação de Computadores II

MC-102 Aula 19 Ponteiros II

Alocação Dinâmica de Memória

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 26/11/2010

Alocação Dinâmica de Memória - Exercício

ponteiros INF Programação I Prof. Roberto Azevedo

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

Linguagem de Programação

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

Programação Básica. Estrutura de um algoritmo

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

Alocação e Gerência de Memória: APONTADORES

Transcrição:

Programação de Computadores II 2019.1

Endereço e Ponteiro Endereço Ao colocarmos o símbolo & temos o endereço daquela variável. Ponteiro Ao colocarmos o símbolo * temos o valor da variável armazenada num determinado endereço. int *p; int n=0; p = &n; 0x003A4581: 0x003A4585: 0x003A4589: 0x003A4585 0x00000000 0x19374998 p n O valor de n eh: 0x00000000 O endereço de n é: 0x003A4585 O valor de *n é: ERROR O valor de p é: 0x003A4585 O endereço de p é: 0x003A4581 O valor de *p é: 0x00000000

Endereço e Ponteiro Ponteiros e endereços são sempre utilizados juntos.

Registro typedef struct aluno { int matricula; float nota; char *nome; Aluno; Aluno a; Aluno *p; p = &a; A variável p terá o tamanho de um endereço de memória (4 bytes). A região apontada por p terá o tamanho do tipo Aluno (12 bytes: um int, um float e um endereço).

Registro typedef struct aluno { int matricula; float nota; char *nome; Aluno; Aluno a; Aluno *p; p = &a;

Registro typedef struct aluno { int matricula; float nota; char *nome; Aluno; Aluno a; Aluno *p; p = &a; A variável nome terá o mesmo tamanho da variável p, o tamanho de um endereço de memória.

Registro typedef struct aluno { int matricula; float nota; char *nome; Aluno; Aluno a; Aluno *p; p = &a; (*p).nota = 10; p->nota = 10; a.nota = 10; (*p).nome é equivalente a p->nome

Ponteiro para Ponteiro int a = 10; int *p, **q, ***r; p = &a; q = &p; r = &q; printf("o endereco de r é %d", &r); printf("o valor de r é %d", r); printf("o valor de *r é %d", *r); printf("o valor de **r é %d", **r); printf("o valor de ***r é %d", ***r); O endereco de r é 0x005D334AF O valor de r é 0x005D334AB O valor de *r é 0x005D334A7 O valor de **r é 0x005D334A3 O valor de ***r é 10

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. int a = 10, b = 20; int *p, *q; p = &a; *q = 10; q = &b; *p = 15; p = &a;

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. int a = 10, b = 20; int *p, *q; p = &a; q = NULL; *q = 10; q = &b; *p = 15; p = &a;

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. int a = 10, b = 20; int *p, *q; p = &a; q = &b; *q = 10; *p = 15; p = &a;

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; printf("%c", str1[0]); printf("%c", str2[0]); printf("%c", str3[0]);

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; printf("%c", str1[0]); printf("%c", str2[0]); printf("%c", str3[0]);

Segmentation Fault Normalmente ocorrem quando há a tentativa de acessar uma região de memória que o programa não tem acesso. Um erro desse faz com que o programa pare imediatamente! Um printf() normalmente é escrito no buffer e não aparece na saída padrão imediatamente. Um Seg Fault pode ocorrer depois de um printf() e, como ele ainda estava no buffer, não ser direcionado para a saída padrão. Para testar e debugar seu programa utilize a saída de erro, ela não vai para o buffer, é escrita imediatamente.

Segmentation Fault Normalmente ocorrem quando há tentativa de acessar uma região de memória que o programa não tem acesso. int a = 10; int *p; p = &a; p = NULL; printf("erro."); *p = 20; Segmentation Fault. int a = 10; int *p; p = &a; p = NULL; fprintf(stderr, "Erro."); *p = 20; Erro. Segmentation Fault.

Parênteses Ponteiros são inteiros, portanto, é permitido fazer contas aritmética com eles. int n = 10; int *p; p = &n; 0x003A4581: 0x003A4585: 0x003A4589: 0x003A458D: 0x003A4591: 0x003A4595: 0x0000000A 0x003A4581 0xC0FE5409 0x45413200 0x4B432BC8 0x19374998 n p

Parênteses Ponteiros são inteiros, portanto, é permitido fazer contas aritmética com eles. int n = 10; int *p; p = &n; (*p)++; 0x003A4581: 0x003A4585: 0x003A4589: 0x003A458D: 0x003A4591: 0x003A4595: 0x0000000B 0x003A4581 0xC0FE5409 0x45413200 0x4B432BC8 0x19374998 n p

Parênteses Ponteiros são inteiros, portanto, é permitido fazer contas aritmética com eles. int n = 10; int *p; p = &n; *p++; 0x003A4581: 0x003A4585: 0x003A4589: 0x003A458D: 0x003A4591: 0x003A4595: 0x0000000A 0x003A4585 0xC0FE5409 0x45413200 0x4B432BC8 0x19374998 n p

Parênteses Ponteiros são inteiros, portanto, é permitido fazer contas aritmética com eles. As operações aritméticas com ponteiros são feitas na unidade do tamanho do tipo guardado nele.

Exemplo char c = a ; char b = e ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0xB9 0xAC 0xC0FE5409 0x45413200 0x4B432BC8

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0xAC 0xC0FE5409 0x45413200 0x4B432BC8 c

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0xC0FE5409 0x45413200 0x4B432BC8 c b

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0xC0FE5409 0x45413200 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0x003A4587 0x45413200 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0x003A4587 0x003A4581 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0x003A4588 0x003A4581 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: 0x41 0x45 0x003A458B 0x003A4582 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: E 0x41 0x45 0x003A458B 0x003A4582 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: E Segmentation Fault. 0x41 0x45 0x003A458B 0x003A4582 0x4B432BC8 c b p q

Exemplo char c = A ; char b = E ; char **p, *q; p = &q; q = &c; p++; q++; printf("%c\n", *q); printf("%c\n", **p); 0x003A4581: 0x003A4582: 0x003A4583: 0x003A4587: 0x003A458B: E Segmentation Fault. 0x41 0x45 0x003A458B 0x003A4582 0x4B432BC8

Alocação de Memória char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; scanf("%s", str3); 0x003A4581: 0x003A4632 str1 0x003A4585: 0x003A4940 str2 0x003A4589: 0x254AC570 str3 0x003A4632: "Hello World" 0x003A4940: "Hello" 0x003A5021:???

Alocação de Memória char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; scanf("%s", str3); 0x003A4581: 0x003A4632 str1 0x003A4585: 0x003A4940 str2 0x003A4589: 0x254AC570 str3 0x003A4632: "Hello World" 0x003A4940: "Hello" 0x003A5021:??? Segmentation Fault.

Alocação de Memória char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; str3 = (char*) malloc(4); scanf("%s", str3); 0x003A4581: 0x003A4585: 0x003A4589: 0x003A4632: 0x003A4940: 0x003A5021: 0x003A4632 str1 0x003A4940 str2 0x003A5021 str3 "Hello World" "Hello" "Ola"

Alocação de Memória char* str1, str2, str3; str1 = "Hello World"; str2 = "Hello"; str3 = (char*) malloc(4); scanf("%s", str3); free(str3); 0x003A4581: 0x003A4585: 0x003A4589: 0x003A4632: 0x003A4940: 0x003A5021: 0x003A4632 str1 0x003A4940 str2 0x003A5021 str3 "Hello World" "Hello" "Ola"

Alocação de Memória malloc() Aloca uma região de memória. Ele retorna um endereço para aquela região e tem como argumento o tamanho da região a ser alocada em bytes. ponteiro = (tipo) malloc(tamanho); int *p; p = (int *) malloc(sizeof(int))

Alocação de Memória free() Desaloca uma região de memória, liberando espaço na memória. Precisa somente do endereço da posição de memória. free(ponteiro); int *p; p = (int *) malloc(sizeof(int)) free(p)

Exercício Faça um programa que: leia um valor n aloque na memória um ponteiro para n inteiros desaloque a memória

Exercício: Solução #include <stdio.h> #include <stdlib.h> // leia um valor n int n; scanf("%d", &n); // aloque na memória um ponteiro para n inteiros int* v = (int*) malloc(n*sizeof(int)); // desaloque a free(v);