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

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

Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Dominar a manipulação de arquivos

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

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Linguagem C Ponteiros

Programação Estruturada

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

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

Ponteiros e Alocação de Memória

Princípios de Desenvolvimento de Algoritmos MAC122

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

Programação de Computadores II

ponteiros INF Programação I Prof. Roberto Azevedo

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

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

Introdução a Programação. Tipos Estruturados de Dados

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

Algoritmos e Estruturas de dados

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

Programação de Computadores II

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

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

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

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

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.

Aula 25: Alocação Dinâmica

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Linguagem C. Ponteiros. Alex Vidigal Bastos.

BCC202 - Estrutura de Dados I

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

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

Tipos Abstratos de Dados. Estrutura de Dados

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

Ponteiros, ponteiros e vetores e alocação dinâmica de memória

Vetores e Matrizes. Prof. Fabrício Olivetti de França Charles Henrique

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

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

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Ponteiros. Baseado nos slides do Prof. Mauro.

Alocação Dinâmica de Memória

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

DAS5102 Fundamentos da Estrutura da Informação

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

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

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 de Computadores II. Cap. 5 Vetores

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

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Métodos Computacionais. Tipos Estruturados

Aula 24 Ponteiros, vetores e structs

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

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

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

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

Alocação Dinâmica de Memória

Módulo 8 Tipos Estruturados

Ponteiros. Introdução

Reinaldo Gomes Alocação Dinâmica

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

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

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Alocação Dinâmica em C

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

Introdução à Computação

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

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

Aula 23: Ponteiros Introdução a Programação Túlio Toffolo & Puca Huachi

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

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

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.

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

Linguagem C: Introdução

Linguagem C ponteiros

3. Linguagem de Programação C

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

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

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

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Estrutura de dados 1. Ponteiros

Mais sobre Ponteiros em C

1 Exercícios com ponteiros

Ponteiros. um ponteiro é uma variável que contém o endereço um dado declaração: * indica que a variável é um ponteiro. Ex: tipo_dado *nome_ponteiro;

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

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

Linguagem de Programação C. Ponteiros

Estruturas de Dados. Profa. Juliana Pinheiro Campos

11a. Aula Ponteiros e Vetores

10. - ESTRUTURAS Características Básicas

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

Professora Jeane Melo

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

Estruturas Dinâmicas - Ponteiros

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

Transcrição:

Ponteiro Definição de variável apontadora Aritmética de ponteiros Ponteiros e vetores Funções e passagem por referência Structs e ponteiros Alocação dinâmica de memória

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

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4;

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 32 bits 151266124 endereço conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 32 bits 151266124 endereço conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 32 bits 151266124 endereço Célula Célula Célula Célula conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 32 bits 1 byte 1 byte 1 byte 1 byte 151266124 endereço Célula Célula Célula Célula conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 151266124 32 bits 1 byte 1 byte 1 byte 1 byte endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 32 bits 1 byte 1 byte 1 byte 1 byte 151266124 endereço = 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 151266124 32 bits 1 byte 1 byte 1 byte 1 byte endereço 151266124 151266125 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 151266124 32 bits 1 byte 1 byte 1 byte 1 byte endereço 151266124 151266125 151266126 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 1º: alocação de espaço de armazenamento com endereçamento para permitir o acesso a este espaço. x 151266124 32 bits 1 byte 1 byte 1 byte 1 byte endereço 151266124 151266125 151266126 151266127 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 2º: atribuição de valor de acordo com o tipo definido no espaço de conteúdo. x 32 bits 151266124 endereço 4 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 2º: atribuição de valor de acordo com o tipo definido no espaço de conteúdo. x 151266124 endereço 151266124 151266125 151266126 151266127 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; 2º: atribuição de valor de acordo com o tipo definido no espaço de conteúdo. x 151266124 endereço 00000000 00000000 00000000 00000100 151266124 151266125 151266126 151266127 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; int y;

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int y; 151266124 endereço 4 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int y; y 151266124 endereço 4 conteúdo 151266128 endereço 165564619 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int y; y = x; 151266124 4 y endereço conteúdo 131233128 endereço 4 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; 151266124 endereço 4 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p 151266124 endereço 4 conteúdo 151266128 endereço 5156161515 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 4 p endereço conteúdo 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 4 p endereço conteúdo 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 4 endereço conteúdo *p = 10; p 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 4 endereço conteúdo *p = 10; p 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 4 endereço conteúdo *p = 10; p 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 10 endereço conteúdo *p = 10; p 151266128 endereço 151266124 conteúdo

Como ocorre a declaração e atribuição de valores em variáveis de tipos primitivos? int x = 4; x int* p; p = &x; 151266124 10 endereço conteúdo *p = 10; p 151266128 endereço 151266124 conteúdo

Variáveis Apontadoras Como visto, qualquer variável tem um nome, conteúdo e endereço. Uma variável apontadora é um caso particular em que o valor (inteiro) que ela contém é um endereço de memória.

Variáveis Apontadoras Como visto, qualquer variável tem um nome, conteúdo e endereço. Uma variável apontadora é um caso particular em que o valor (inteiro) que ela contém é um endereço de memória. Observe que uma variável apontadora sempre armazenará valores inteiros.

Variáveis Apontadoras - Declaração <tipoapontado> * <nome> ; Exemplos: int* p1; char* p2; float* p3, p4;//p4 será uma variável comum float *p3, *p4;//p4 será uma variável ponteiro double* p4;

Operador de Endereço (&) Retorna o endereço de uma variável; Útil interpretá-la como endereço de. Exemplo: int x = 4; int* px; px = &x; //px recebe o endereço de x

Operador Apontador (*) Pode-se atribuir um valor à variável apontada pelo ponteiro. Útil interpretá-lo como o conteúdo apontado por.

Exemplo: int x = 4; int* px = &x; *px = 10; Ponteiro Ponteiro Operador Apontador (*) o conteúdo apontado por px receberá o valor 10. No caso, o conteúdo da variável x;

Operador Apontador (*) Posso atribuir a uma variável do tipo int um endereço de uma variável? Sim. (Ex: int x, y; x = &y;) Posso alterar o conteúdo de uma variável utilizando o operador apontador em uma variável do tipo int que está armazenando um endereço de memória? Não. (Ex: int x, y; x = &y; *x = 10; //erro de compilação)

Ponteiros e operações aritméticas Posso efetuá-las com ponteiros? Sim, lembre-se que as operações serão efetuadas em endereços, já que ponteiros armazenam endereços. As operações possíveis com ponteiros são as de soma (+), subtração (-), incremento (++) e decremento (--).

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238 int* p = &x; //p = 1234

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238 int* p = &x; //p = 1234 p = p + 1; // p = 1238

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238 int* p = &x; //p = 1234 p = p + 1; // p = 1238 p = p 1; // p = 1234

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238 int* p = &x; //p = 1234 p = p + 1; // p = 1238 p = p 1; // p = 1234 p++; // p = 1238

Ponteiros e operações aritméticas Operações com ponteiros de inteiros: int x = 10; //supondo &x = 1234 int y = 20; //então, &y = 1238 int* p = &x; //p = 1234 p = p + 1; // p = 1238 p = p 1; // p = 1234 p++; // p = 1238 P--; // p = 1234

Ponteiros e operações aritméticas Operações com ponteiros de reais (double): double x; //supondo &x = 1238 double y; //então, &y = 1246 double* p = &x; //p = 1238 p = p + 1; // p = 1246 p = p 1; // p = 1238 p++; // p = 1246 P--; // p = 1238

Ponteiros e operações aritméticas Operações com ponteiros de char: char x; //supondo &x = 1231 char y; //então, &y = 1232 char* p = &x; //p = 1231 p = p + 1; // p = 1232 p = p 1; // p = 1231 p++; // p = 1232 P--; // p = 1231

Vetores e ponteiros Como se sabe, em uma variável simples, ao efetuarmos tal comando, int x = 20, y; y = x; no lugar do nome x, é retornado o valor da variável. Para retornarmos seu endereço, utilizamos: y = &x;

Vetores e ponteiros O que aconteceria se fizéssemos esse comando com um vetor? int vet[5]; int* x = vet; O nome de um vetor atribuído a uma variável retorna o endereço do próprio vetor.

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet índices 0 1 2 3 4 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 1115 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 1115 1119 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 1115 1119 1123 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 índices 0 1 2 3 4 1111 1115 1119 1123 1127 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 vet 1111 1115 1119 1123 1127 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; p 1107 endereço 1111 conteúdo vet 1111 1115 1119 1123 1127 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; *p = 10; p 1107 endereço 1111 conteúdo vet 1111 1115 1119 1123 1127 10 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1115 endereço conteúdo vet 1111 1115 1119 1123 1127 10 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1115 *p = 20; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1119 endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1119 *p = 30; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1123 endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1123 *p = 40; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 40 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1127 endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 40 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p++; p 1107 1127 *p = 50; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 40 50 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p--; p 1107 1123 *p = 50; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 30 50 50 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p--; p 1107 1119 *p = 50; endereço conteúdo vet 1111 1115 1119 1123 1127 10 20 50 50 50 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p--; p 1107 1115 *p = 50; endereço conteúdo vet 1111 1115 1119 1123 1127 10 50 50 50 50 conteúdo conteúdo conteúdo conteúdo conteúdo

Vetores e ponteiros Como funciona o endereçamento de um vetor? int vet[5]; //supondo vet = 1111 int* p = vet; // p = 1111... p--; p 1107 1111 *p = 50; endereço conteúdo vet 1111 1115 1119 1123 1127 50 50 50 50 50 conteúdo conteúdo conteúdo conteúdo conteúdo

Ponteiros como argumentos de funções Como trocar valores entre duas variáveis na função? void troca(int x, int y) { int temp; temp = x; x = y; y = temp; }

Ponteiros como argumentos de funções Como trocar valores entre duas variáveis na função? int main() { int a = 4, b = 2; troca(a,b); printf ( %d %d\n,a,b); return 0; } O VALOR NÃO É TROCADO NA MAIN!

Ao chamar a função: troca(a,b); Ponteiro Ponteiro Ponteiros como argumentos de funções

Ponteiros como argumentos de funções Ao chamar a função: troca(a,b); Na passagem de parâmetros, efetivamente seria como se fizéssemos o seguinte comando: x = a; y = b;

Ponteiros como argumentos de funções Ao chamar a função: troca(a,b); Na passagem de parâmetros, efetivamente seria como se fizéssemos o seguinte comando: x = a; y = b; Os valores internos das variáveis a e b após a chamada da função são realmente alterados?

Ponteiros como argumentos de funções Este tipo de passagem de parâmetros é comumente chamada de Passagem por Valor

Ponteiros como argumentos de funções Como trocar valores entre duas variáveis na função? void troca(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; }

Ponteiros como argumentos de funções Como trocar valores entre duas variáveis na função? int main() { int a = 4, b = 2; troca(&a,&b); printf ( %d %d\n,a,b); return 0; } O VALOR É TROCADO NA MAIN!

Ao chamar a função: troca(&a,&b); Ponteiro Ponteiro Ponteiros como argumentos de funções

Ponteiros como argumentos de funções Ao chamar a função: troca(&a,&b); Na passagem de parâmetros, efetivamente seria como se fizéssemos o seguinte comando: x = &a; y = &b;

Ponteiros como argumentos de funções Ao chamar a função: troca(&a,&b); Na passagem de parâmetros, efetivamente seria como se fizéssemos o seguinte comando: x = &a; y = &b; Os valores internos das variáveis a e b após a chamada da função são alterados, pois ocorreu a troca de valores referentes às variáveis que possuem os endereços de memória &a e &b.

Ponteiros como argumentos de funções Este tipo de passagem de parâmetros é comumente chamada de Passagem por Referência

Vetores como argumentos de funções Vetores são passados como parâmetros em funções por referência ou valor? void atribui_valor(int *vet,int tam, int valor) { int i; for (i = 0; i<tam; i++) vet[i] = valor; }

Vetores como argumentos de funções Logo, quando fazíamos: void função(int vet[]); para recebermos um vetor passado como argumento, estamos fazendo EXATAMENTE: void função(int *vet); Portanto, em C: vet[] *vet

Exemplo 1 Ponteiro Ponteiro Um função que inicializa um vetor: int* inicializavet (int tam){ int i; int vet = malloc(tam*sizeof(int)); for (i=0; i<tam; i++){ *(vet + i) = 0; } return vet; }

Exemplo 2 Ponteiro Ponteiro Uma função de leitura de duas variáveis: int leituraxy(int* x, int* y){ printf( Entre com as coordenadas ); scanf( %d %d,x,y); }

Exemplo 3 Ponteiro Ponteiro Uma função que compara duas strings: int comparastring(char* str1, char* str2){ char *i,*j; for ( i = str1, j = str2; *i!= '\0' && *j!= '\0' && *i == *j; i++, j++ ); return *i - *j; }

Exemplo 4 Ponteiro Ponteiro Uma função que compara duas strings: int comparastring(char* str1, char* str2){ char i; for ( i = 0; str1[i]!='\0' && str2[i]!='\0' && str1[i]==str2[i]; i++ ); return str1[i] str2[i]; }

Estruturas e ponteiros Como em qualquer outro tipo de dado, ponteiros para estruturas também podem ser definidos. typedef struct{ int x; int y; }Ponto;

Estruturas e ponteiros int main() { Ponto p, *ponteirop; ponteirop = &p; (*ponteirop).x = 1; (*ponteirop).y = 2; return 0; }

Estruturas e ponteiros A forma de referenciar o conteúdo da struct apontada pelo ponteiro é sempre da forma: (*ponteiro).atributo sendo que os parenteses são necessários, devido a precedência superior do operador. se comparado com *.

Estruturas e ponteiros Acessar uma struct apontada por um ponteiro para muitos pode parecer confusa. É muito comum errar os parenteses necessários para garantir a precedência dos operadores. e *.

Estruturas e ponteiros Acessar uma struct apontada por um ponteiro para muitos pode parecer confusa. É muito comum errar os parenteses necessários para garantir a precedência dos operadores. e *. Pensando nisso, os projetistas de C definiram um operador adicional denominado operador seta ( -> ), com a missão de facilitar o acesso aos membros de uma struct.

Dessa forma, Ponteiro Ponteiro Estruturas e ponteiros (*p).atr; p->atr;

Alocação Dinâmica de Memória Objetivos: Utilizar espaços da memória de tamanho arbitrário; Criar estruturas de dados usando encadeamento; É a base do conceito da alocação por demanda, dinâmica.

Alocação Dinâmica de Memória Motivação: Alocação de espaço sob demanda: Muitas vezes o espaço de memória necessário para um conjunto de dados varia durante a execução do programa. Dessa forma, a alocação dinâmica permite que quando for preciso utilizar algum recurso de memória, este seria alocado enquanto o programa estivesse em execução.

Alocação Dinâmica de Memória Funções para alocação dinâmica: Funções principais: - malloc() Aloca um espaço na memória e retorna um ponteiro para o espaço alocado - free() - Libera espaço alocado na memória para que possa ser utilizados por outras aplicações ou por outras chamadas de malloc().

Alocação Dinâmica de Memória Exemplo 1 Alocação Estática int main() { int vet[100]; int n; scanf( %d,&n); //alocação estática em tempo de execução int vet2[n]; return 0; }

Alocação Dinâmica de Memória Exemplo 2 Alocação Dinâmica int main() { int *vet1 = malloc(100*sizeof(int)); int n; scanf( %d,&n); int *vet2 = malloc(n*sizeof(int)); return 0; }

Alocação Dinâmica de Memória Exemplo 3 Alocando string dinamicamente int main() { char* vet = malloc(100*sizeof(char)); scanf( %s,vet); }

Alocação Dinâmica de Memória Liberando espaços com free(): Sempre que um espaço alocado fica sem referência este é perdido, não podendo ser utilizado novamente (memory leak). Antes de fazer um apontador apontar para outro espaço, ou quando o espaço não for mais utilizado, a área de memória que este aponta deve ser liberada com free: a = malloc(10*sizeof(int));... free(a); // O espaço de memória alocado dinâmicamente foi liberado!