Professor Aquiles Burlamaqui UERN

Slides:



Advertisements
Apresentações semelhantes
Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 10 Criado por Frederick H. Colclough, Colorado Technical University Ponteiros e Vetores.
Advertisements

Laboratório de programação III Linguagem C
Marco Antonio Montebello Júnior
Construção de Algoritmos AULA 07
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
Nivelamento de C: Ponteiros e Alocação Dinâmica
Programação II Estruturas de Dados
Désiré NGuessan Programação II Estruturas de Dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
Algoritmos e Programação Linguagens de Programação Teoria Aula 5 (05/05) Universidade Federal do Vale do São.
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Alocação Dinâmica de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Ponteiros em C.
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
LPG-I: Tipos Complexos - Estruturas
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Universidade de Brasília
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Linguagem C Strings.
Estruturas de Dados Homogêneas Unidimensionais – Vetores e Strings
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Unidades de Armazenamento
Ponteiros.
Ling. C - Variáveis Uma variável não é mais do que o nome que nós damos a uma determinada posição de memória para conter um valor de um determinado tipo.
Escola Secundária c/ 3º CEB da Batalha
1MF. Vectores Tipo de dado usado para representar um CONJUNTO de dados do um mesmo tipo Estrutura de dados homogénea unidimensional Ex: Ler a nota de 3.
Escola Secundária c/ 3º CEB da Batalha
Apontadores ou Ponteiros
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
1 Ponteiros Ponteiros são variáveis que guardam localizações em memória. A declaração de uma variável ponteiro x para um dado tipo type é type *x; Essa.
Linguagem de Programação II Parte IX
Definição de Tipos Estruturas e Ponteiros
Construção de Algoritmos Professor: Aquiles Burlamaqui Construção de Algoritmos AULA 07 Aquiles Burlamaqui UERN
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
PROGRAMAÇÃO PROCEDIMENTAL
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Linguagem C : Ponteiros
Estruturas de Dados Aula 5: Matrizes
Programação em C++ Compiladores
Aula 13 - Armazenamento de Dados em Arquivos
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
1 Alocação Dinâmica Quando se declara arrays o tamanho deve ser fixo e definido primeiramente –Alocação estática Pode-se alocar dinamicamente o espaço.
Algoritmos e Estruturas de Dados
Joaquim José Hangalo  Podemos entender a memória do computador como um conjunto de células que armazenam informações.  Cada célula.
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem C.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 2 Variáveis e Atribuições.
PROGRAMAÇÃO II – PARTE 6 Profa. Maria Augusta Constante Puget.
Ponteiros em C Prof. Kariston Pereira
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Aula Prática 6 Vetores e Matrizes Monitoria
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
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.
Ponteiros.
Transcrição da apresentação:

Professor Aquiles Burlamaqui UERN Ponteiros

A memória Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 Célula Para um melhor entendimento do uso de ponteiros na linguagem de programação C é imprescindível compreender o seu relacionamento com a memória do computador em que o programa esta executando. A memória é formada por várias células. Cada celular contém um endereço e um valor. O Tamanho do endereço e o tamanho do valor depende da arquitetura do computador (ex: 32 bits ou 64 bits). Endereço Valor 0000000D ?? Célula

Variáveis Caracteres Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { char i; } Declaro um caractere chamado i. Os caracteres ocupam 1 bytes na memória(para uma arquitetura de 32 bits).

Variáveis Inteiras Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; } Declaro um inteiro chamado i. Os inteiros ocupam 4 bytes na memória(para uma arquitetura de 32 bits)

Variáveis Flutuantes Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { float i; } Declaro um número ponto flutuante chamado i. Os flutuantes ocupam 4 bytes na memória(para uma arquitetura de 32 bits)

Variáveis Flutuante Longo Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 int main() { double i; } i Declaro um número ponto flutuante grande chamado i. Os flutuantes ocupam 8 bytes na memória(para uma arquitetura de 32 bits)

Declaração de ponteiros Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 c int main() { char* c; int* i; float* f; double d; } i Declaração de quatro ponteiros(c,i,f e d). Cada ponteiro de um tipo diferente(char, int, float, double). Todos eles ocupam o mesmo espaço na memória, 4 bytes. Isso acontece porque todos eles armazenam endereços de memória, e o tamanho de um endereço de memória é o mesmo para todos os tipos. f d

Exemplo 1 Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; i = 15; char c = ‘s’; int * p = &i; *p = 25; } Declaro um inteiro chamado i. Os inteiros ocupam 4 bytes na memória(para uma arquitetura de 32 bits)

Exemplo 1 Endereço Valor 00000000 00 00000001 00000002 00000003 15 00000004 ?? 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; i = 15; char c = ‘s’; int * p = &i; *p = 25; } Faço uma atribuição. A variável i recebe o valor 15. Esse valor 15 é colocado no campo valor da memória alocada previamente para a variável i. Lembrem que essa notação com o 15 na ultima casa é apenas didática na verdade esse valor é armazenado utilizando a notação complemento de 2(tudo em binário).

Exemplo 1 Endereço Valor 00000000 00 00000001 00000002 00000003 15 00000004 s 00000005 ?? 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; i = 15; char c = ‘s’; int * p = &i; *p = 25; } c Variável c do tipo char criada e inicializada com o valor ‘s’. Uma variável do tipo char ocupa 1 byte na memória em nossa arquitetura 32 bits.

Exemplo 1 Endereço Valor 00000000 00 00000001 00000002 00000003 15 00000004 s 00000005 00000006 00000007 00000008 00000009 ?? 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; i = 15; char c = ‘s’; int * p = &i; *p = 25; } c p Ponteiro de inteiro declarado. O nome desse ponteiro é p e ele é inicializada no momento de sua criação. O valor que esse ponteiro recebe ao ser inicializado é o endereço da variável i(&i) que nesse caso é o endereço 000000. Dizemos que p aponta para i.

Exemplo 1 Endereço Valor 00000000 00 00000001 00000002 00000003 25 00000004 s 00000005 00000006 00000007 00000008 00000009 ?? 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 i int main() { int i; i = 15; char c = ‘s’; int * p = &i; *p = 25; } c p Finalizando, fazemos uma atribuição. Colocamos 25 no valor apontado por p. Como visto no slide anterior p aponta para i. Desse modo, colocamos 25 no valor da variável i.

Exemplo 2 Endereço Valor 00000000 ?? 00000001 00000002 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 p1 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } Declaração de um ponteiro para char.

Exemplo 2 Endereço Valor 00000000 00 00000001 00000002 00000003 04 00000004 ?? 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 p1 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } O ponteiro p1 recebe o endereço da primeira posição do espaço reservado pela instrução malloc(...). Nesse caso o malloc aloca 1 byte: sizeof(char) é igual a 1. Dizemos que p1 aponta para o byte reservado pelo malloc.

Exemplo 2 Endereço Valor 00000000 00 00000001 00000002 00000003 04 00000004 ?? 00000005 00000006 00000007 00000008 09 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 p1 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } p2 Declaração de um ponteiro para inteiro (p2). Esse ponteiro é inicializado com o valor da primeira posição do espaço alocado pelo malloc. malloc(sizeof(int)*2) aloca 4*2 bytes,ou seja 8 bytes. O espaço equivalente a dois inteiros.

Exemplo 2 Endereço Valor 00000000 00 00000001 00000002 00000003 04 00000004 ?? 00000005 00000006 00000007 00000008 09 00000009 0000000A 0000000B 0000000C 55 0000000D 0000000E 0000000F 00000010 p1 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } p2 O valor apontado por p2 recebe 55.

Exemplo 2 Endereço Valor 00000000 00 00000001 00000002 00000003 04 00000004 ?? 00000005 00000006 00000007 00000008 09 00000009 0000000A 0000000B 0000000C 55 0000000D 0000000E 0000000F 00000010 11 p1 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } p2 A valor apontado por p2+1 recebe 11. Podemos somar ou subtrair do ponteiro. Com isso podemos fazer com o ponteiro aponte não somente para a primeira posição que lhe foi reservado. p2 => 00000009 + 1 (1 int => 4 bytes) p2+1 0000000D *p2 *(p2+1)

Exemplo 3 Endereço Valor 00000000 00 00000001 00000002 00000003 04 00000004 B 00000005 O 00000006 L 00000007 A 00000008 S 00000009 0000000A 0000000B 0000000C 0D 0000000D F 0000000E ?? 0000000F 00000010 int main() { char * p1 = malloc(sizeof(char)*5); char * p2 = malloc(sizeof(char)); *p2 = ‘F’; p1 = “BOLAS”; char * p3 = malloc(sizeof(char)*6); *p3 = *p2; *(p3+1) = *p1; *(p3+2) = *(p1+1); } p1 ---- Endereço Valor 00000011 00 00000012 00000013 00000014 19 00000015 B 00000016 O 00000017 L 00000018 A Endereço Valor 00000019 F 0000001A 00 0000001B 0000001C 04 0000001D B 0000001E O 0000001F L 00000020 A p2 p3