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

Documentos relacionados
LINGUAGEM C: PONTEIROS

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

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

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

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

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor e sim um endereço para aquele tipo especificado.

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

3. Linguagem de Programação C

Introdução a Ponteiros e Vetores em C

Programação: Vetores

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

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

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.

Ponteiros. Baseado nos slides do Prof. Mauro.

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

SSC304 Introdução à Programação Para Engenharias. Variáveis Indexadas em C. GE4 Bio

Algoritmos e Programação

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

19 - Ponteiros em C Parte 1

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

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

Introdução à Programação

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

SSC304 Introdução à Programação Para Engenharias. Operadores em C. GE4 Bio

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

Alocação Dinâmica em C

Programação Estruturada

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

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

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

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

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

11a. Aula Ponteiros e Vetores

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

Algoritmos e Estruturas de dados

Introdução à Computação

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

Variáveis e Operadores em C

Ponteiros e Alocação de Memória

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;

Computação 2. Aula 2. Profª. Fabiany Vetores e Matrizes

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

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.

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

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

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

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

Tipos Abstratos de Dados. Estrutura de Dados

Linguagem de Programação C. Ponteiros

Introdução à Computação MAC0110

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

ponteiros INF Programação I Prof. Roberto Azevedo

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

Princípios de Desenvolvimento de Algoritmos MAC122

INF 1007 Programação II

Introdução. Ponteiros

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

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

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

Linguagem C Ponteiros

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

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

SSC304 Introdução à Programação Para Engenharias. Introdução a Linguagem C. GE4 Bio

Nomes de variáveis Todo nome de variável deve iniciar com uma letra ou sublinha _.

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

Aula 24 Ponteiros, vetores e structs

LINGUAGEM C: ALOCAÇÃO DINÂMICA

x=0; y=x+1; x=&y+2; x 1000 y 1004

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

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

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

INF 1007 Programação II

Métodos Computacionais. Tipos Estruturados

Estruturas Dinâmicas - Ponteiros Parte I

Métodos Computacionais. Vetores e Matrizes Dinâmicas

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Aula 9 Agregado Heterogêneo Ponteiro. prof Leticia Winkler

Introdução a Computação

Princípios de Desenvolvimento de Algoritmos MAC122

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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Linguagem C ponteiros

Programação Estruturada

Introdução a Programação de Jogos

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

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

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

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

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

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

Fundamentos de Programação

PIC - PROGRAMAÇÃO LINGUAGEM C. AUTOR: ENG. ANTONIO CARLOS LEMOS JÚNIOR

Transcrição:

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias s GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos Prof.Dr. Danilo Spatti São Carlos - 2018

2 Variável: É um espaço reservado de memória usado para guardar um valor que pode ser modificado pelo programa. Definições : É um espaço reservado de memória usado para guardar o endereço de memória de uma outra variável. Um ponteiro é uma variável como qualquer outra do programa sua diferença é que ela não armazena um valor inteiro, real, caractere ou booleano. Ela serve para armazenar endereços de memória (são valores inteiros sem sinal).

3 Declaração (I) É o asterisco (*) que informa ao compilador que aquela variável não vai guardar um valor mas sim um endereço para o tipo especificado. int *x; float *y; struct *p;

4 Declaração (II) Na linguagem C, quando declaramos um ponteiro nós informamos ao compilador para que tipo de variável vamos apontálo. Um ponteiro int* aponta para um inteiro, isto é, int. Esse ponteiro guarda o endereço de memória onde se encontra armazenada uma variável do tipo int.

5 Inicialização (I) s apontam para uma posição de memória. Cuidado: s não inicializados apontam para um lugar indefinido. Exemplo int *p; Memória posição variável conteúdo 119 120 int *p???? 121 122 123

6 Inicialização (II) Pode ter o valor especial NULL que é o endereço de nenhum lugar. Exemplo int *p = NULL; Memória posição variável conteúdo 119 120 int *p NULL 121 122 123

7 Os ponteiros devem ser inicializados antes de serem usados. Inicialização (III) Assim, devemos apontar um ponteiro para um lugar conhecido. Podemos apontá-lo para uma variável que já exista no programa. Memória posição variável conteúdo 119 120 int *p 122 121 122 int c 10 123

8 Inicialização (IV) O ponteiro armazena o endereço da variável para onde ele aponta. Para saber o endereço de memória de uma variável do nosso programa, usamos o operador &. Ao armazenar o endereço, o ponteiro estará apontando para aquela variável.

9 # include <stdio.h> # include <locale.h> int main() { setlocale(lc_all, "Portuguese"); int c = 10; int *p; p = &c; printf("c = %d\n",c); printf("p = %d\n",p); return 0; } Exemplo 1

10 Acesso (I) Tendo um ponteiro armazenado um endereço de memória, como saber o valor guardado dentro dessa posição? Para acessar o valor guardado dentro de uma posição na memória apontada por um ponteiro, basta usar o operador asterisco * na frente do nome do ponteiro.

11 De modo geral, um ponteiro só pode receber o endereço de memória de uma variável do mesmo tipo do ponteiro. Isso ocorre porque diferentes tipos de variáveis ocupam espaços de memória de tamanhos diferentes. Acesso (II) Na verdade, nós podemos atribuir a um ponteiro de inteiro (int *) o endereço de uma variável do tipo float. No entanto, o compilador assume que qualquer endereço que esse ponteiro armazene obrigatoriamente apontará para uma variável do tipo int. Isso gera problemas na interpretação dos valores.

12 # include <stdio.h> # include <locale.h> Exemplo 2 int main() { setlocale(lc_all, "Portuguese"); int c = 10; int *p; p = &c; printf("conteúdo de c: %d\n",c); printf("conteúdo apontado por p: %d\n",*p); *p = 12; printf("novo conteúdo apontado por p: %d\n",*p); printf("conteúdo de c: %d\n",c); return 0; }

13 # include <stdio.h> Exemplo 3 int main() { int *p, *p1, x = 10; float y = 20.0; p = &x; printf("conteudo apontado por p: %d\n",*p); p1 = p; printf("conteudo apontado por p1: %d\n",*p1); p = &y; printf("conteudo apontado por p: %d\n",*p); printf("conteudo apontado por p: %f\n",*p); printf("conteudo apontado por p: %f\n",*((float*)p)); return 0; }

14 Operações (I) Apenas duas operações aritméticas podem ser utilizadas com endereço armazenado pelo ponteiro: adição e subtração. Podemos apenas somar e subtrair valores INTEIROS p++: soma +1 no endereço armazenado no ponteiro. p--: subtrai 1 no endereço armazenado no ponteiro. p = p+15: soma +15 no endereço armazenado no ponteiro.

15 As operações de adição e subtração no endereço dependem do tipo de dado que o ponteiro aponta. O tipo int ocupa um espaço de 4 bytes na memória. Assim, nas operações de adição e subtração são adicionados/subtraídos 4 bytes por incremento/decremento. Operações (II) Memória posição variável conteúdo 119 120 int a 10 121 122 123 124 int b 20 125 126 127 128 char c k 129 char d s 130

16 Operações (III) Existem operações que são ilegais com ponteiros. Dividir ou multiplicar ponteiros. Somar o endereço de dois ponteiros. Não se pode adicionar ou subtrair valores dos tipos float ou double de ponteiros.

17 Operações (IV) Sobre o conteúdo apontado pelo ponteiro, todas as operações são válidas. (*p)++: incrementa o conteúdo apontado pelo ponteiro Multiplicar o conteúdo da variável apontada pelo ponteiro por 10: *p = (*p) * 10;

18 Operações (V) == e!= para saber se dois ponteiros são iguais ou diferentes. >, <, >=, <= para saber qual ponteiro aponta uma posição mais alta na memória. Exemplo: código para saber se dois ponteiros apontar para o mesmo endereço.

19 # include <stdio.h> Exemplo 4 int main() { int *p, *q, x, y; p = &x; q = &y; if (p == q) printf("s iguais\n"); else printf("s diferentes\n"); return 0; }

20 Genéricos (I) Normalmente, um ponteiro aponta para um tipo específico de dado. Um ponteiro genérico é um ponteiro que pode apontar para qualquer tipo de dado. Declaração void *nome_ponteiro;

21 # include <stdio.h> Exemplo 5 int main() { void *pp; int *p1, p2 = 10; p1 = &p2; pp = &p2; printf("endereco em pp: %p\n",pp); pp = &p1; printf("endereco em pp: %p\n",pp); pp = p1; printf("endereco em pp: %p\n",pp); return 0; }

22 Genéricos (II) Para acessar o conteúdo de um ponteiro genérico é preciso antes convertê-lo para o tipo de ponteiro com o qual se deseja trabalhar. Isso é feito via type cast

23 # include <stdio.h> Exemplo 6 int main() { void *pp; int p2 = 10; pp = &p2; printf("conteudo: %d\n",*(int*)pp); return 0; }

24 Vetores são agrupamentos de dados do mesmo tipo na memória, alocados contiguamente. s e Vetores (I) Quando declaramos um vetor, informamos ao computador para reservar uma certa quantidade de memória a fim de armazenar os elementos do vetor de forma sequencial. O computador nos devolve um ponteiro que aponta para o começo dessa sequência de bytes na memória.

25 O nome do vetor (sem índice) é apenas um ponteiro que aponta para o primeiro elemento do vetor. int vet[5] = {1,2,3,4,5}; int *p; p = vet; s e Vetores (II) Memória posição variável conteúdo 119 120 121 int *p 123 122 123 int vet[5] 1 124 2 125 3 126 4 127 5 128

26 s e Vetores (III) Os colchetes [ ] substituem o uso conjunto de operações aritméticas e de acesso ao conteúdo (operador * ) no acesso ao conteúdo de uma posição de um vetor ou ponteiro. O valor entre colchetes é o deslocamento a partir da posição inicial do vetor. Nesse caso, p[2] equivale a *(p+2).

27 # include <stdio.h> Exemplo 7 int main() { int vet[5] = {1,2,3,4,5}; int *p; p = vet; printf("terceiro elemento de vet: %d ou %d",p[2],*(p+2)); return 0; }

28 int vet[5] = {1,2,3,4,5}; int *p; p = vet; Exemplo 7 Neste exemplo: *p é equivalente a vet[0]; vet[índice] é equivalente a *(p+índice); vet é equivalente a &vet[0]; &vet[índice] é equivalente a (vet+índice);

29 Exemplo 8 Usando vetor Usando ponteiro

30 s e Matrizes Apesar de terem mais de uma dimensão, na memória os dados são armazenados linearmente. Exemplo: int mat[5][5]; 0,0 0,0 1,0 2,0 3,0 4,0 4,4 4,4

31 Exemplo 9 Usando matriz Usando ponteiro

32 Para (I) A linguagem C permite criar ponteiros com diferentes níveis de apontamento. É possível criar um ponteiro que aponte para outro ponteiro, criando assim vários níveis de apontamento. Assim, um ponteiro poderá apontar para outro ponteiro, que, por sua vez, aponta para outro ponteiro, que aponta para um terceiro ponteiro e assim por diante.

33 Para (I) Um ponteiro para um ponteiro é como se você anotasse o endereço de um papel que tem o endereço da casa do seu amigo. Podemos declarar um ponteiro para um ponteiro com a seguinte notação tipo_ponteiro **nome_ponteiro; Acesso ao conteúdo **nome_ponteiro é o conteúdo final da variável apontada; *nome_ponteiro é o conteúdo do ponteiro intermediário.

34 Para (II) Memória posição variável conteúdo 119 120 121 122 int **p2 124 123 124 int *p1 126 125 126 int x 10 127

35 Para (III) É a quantidade de asteriscos (*) na declaração do ponteiro que indica o número de níveis de apontamento que ele possui. int x; // Variável Inteira int *p1; // 1 nível int **p2; // 2 níveis int ***p3; // 3 níveis

36 Exemplo 10 Memória posição variável conteúdo 119 120 char ***p3 122 121 122 char **p2 124 123 124 char *p1 126 125 126 char letra a 127

37 Fim spatti@icmc.usp.br GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos