Sobre Variáveis, Ponteiros, Arrays, Parâmetros e Alocação de Memória

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

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

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.

LINGUAGEM C: PONTEIROS

ALOCAÇÃO DINÂMICA DE MEMÓRIA

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

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

Programação de Computadores III

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

O que é uma variável?

Paradigmas de Linguagens

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Ponteiros de Variáveis

Introdução à Ciência da Computação

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

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

Linguagem de Programação

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

Sumário. 1.1 Variáveis Globais e Locais Passagem de Parâmetro (por valor por referência) 1

1/50. Conceitos Básicos. Programa Básico

ALGORITMOS 3ª Aula. 3. Introdução Tipos de dados, variáveis e operadores Tipos de dados

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

Programação de Computadores I. Professor Ilaim Costa Junior

Entendendo valores e ponteiros em C++

6 Alguns conceitos e comandos em programação

Linguagem C Ponteiros

3. Linguagem de Programação C

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Estrutura de dados 1. Ponteiros

Variáveis e Operadores em C

Compiladores. Gerência de Memória

Introdução à Programação

Bits e operações. Sistemas de Computação

Verificação de Tipo. Unions. Verificação de tipo estática. Verificação de tipo dinâmica

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Linguagem C: Introdução

O AMBIENTE DE PROGRAMAÇÃO VISUAL -PLANO DE ENSINO. Prof. Angelo Augusto Frozza, M.Sc.

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

Linguagem C Princípios Básicos (parte 1)

Linguagens de Programação Aula 11

Programação I Funções. Prof. Carlos Alberto

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

FERRAMENTAS BÁSICAS DA PROGRAMAÇÃO

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

- Mapa de memória de um processo - Ponteiros

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

Lição 4 Fundamentos da programação

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

Programação Estruturada Aula - Tipos, Constantes, Variáveis e Identificadores

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

Ponteiros. Baseado nos slides do Prof. Mauro.

Java Variáveis e Controle Fluxo

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

AULA TEÓRICA 3 Tema 2. Introdução a programação em Java (JVM, JDK)

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

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

Aula 3 Conceitos de memória, variáveis e constantes Cleverton Hentz

Alocação Dinâmica em C

Alocação Dinâmica e Apontadores. Cláudio E. C. Campelo

Conceitos de Linguagens de Programação

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Introdução ao Fortran 90-1

Tipos de Dados Dinâmicos

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Linguagem Computacional

11a. Aula Ponteiros e Vetores

5. Vetores e alocação dinâmica

Computação Eletrônica. Strings. Prof: Luciano Barbosa. CIn.ufpe.br

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

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

MCTA001 Algoritmos e Estruturas de Dados I Aula 02: Ponteiros e estruturas

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

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

Programação Estruturada Aula 2 - Introdução

Linguagem de Programação

Unidade 4: Introdução à Lógica de Programação - Parte II

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Pseudocódigo e Visualg

O nome da variável é utilizado para identificação (para carga e posterior uso). Porém, são necessárias algumas regras para nomear essa variável:

Estrutura de Dados Básica

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Algoritmos e Programação

cadeia de caracteres (string) INF Programação I Prof. Roberto Azevedo

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Unidade 4: Introdução à Lógica de Programação - Parte II Português Estruturado - Versão Estácio Prof. Daniel Caetano

Algoritmos e Estruturas de Dados I

Texto retirado e adaptado da apostila Curso de Linguagem Pascal, disponível no site (autor: desconhecido).

Variáveis primitivas e Controle de fluxo

Algoritmos e Programação. Linguagem C Procedimentos e. Eliane Pozzebon

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

TÉCNICAS DE PROGRAMAÇÃO. Estrutura de dados

Programação I A Linguagem C. Prof. Carlos Alberto

02. [Sebesta, 2000] Quais são as vantagens e as desvantagens dos tipos de dados decimais?

LINGUAGEM C: ARRAY: VETORES E MATRIZES

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

Implementação de subprogramas

Transcrição:

Sobre Variáveis, Ponteiros, Arrays, Parâmetros e Alocação de Memória Queridos, Este texto ainda não está terminado. Ainda vou mudar alguns trechos e ajeitar a formatação, principalmente dos exemplos. Ainda assim, preferi divulgar essa versão temporária para que vocês possam estudar para a prova de terça-feira. O texto trata também de alguns assuntos que vocês ainda não aprenderam. Por ora, podem pular as partes que falam de linguagens forte e fracamente tipadas, ponteiros e alocação de memória. Como sempre, fico a disposição para tirar qualquer dúvida que possa surgir sobre o texto. Boa prova! Variáveis Cordialmente, Lucas Frucht Por trás de todos os demais conceitos que serão abordados nesse texto está o conceito de iável. Embora seja um conceito relativamente simples (ou talvez, justamente, por ser simples), ele não costuma ser explorado em profundidade. Dominar este conceito é a chave para entender os demais. Declarar uma iável em seu código-fonte é dizer ao compilador que ele deve reser um espaço na memória com um determinado tamanho (que depende do tipo da iável) e interpretar o conteúdo daquele espaço como sendo de um determinado tipo. A segunda é mais importante nas linguagens fortemente tipadas. O nome que damos à iável é um rótulo com o qual a identificamos para o compilador. program iavel; a : integer; b : char; c : real; 0000 0000 b 00c4 5d0 c 00c4 5d0 00c4 5d04 00c4 5d06 Uma vez que o espaço é reservado, ele poderá ser usado para armazenar diferentes valores ao longo da execução do programa. Sempre que usamos uma iável o compilador acessa a posição da memória associada àquele rotulo para obter seu conteúdo atual. Quando atribuímos um novo valor a ela, o compilador armazena o valor na posição de memória associada ao rotulo.

Vale lembrar que não existe posição de memória vazia. Quando o compilador reserva o espaço na memória ele continuará com a informação que estava lá antes do programa ser executado. Por esse motivo, nunca podemos assumir que uma iável guarda um determinado valor sem antes inicializá-la (dar a ela um valor inicial). program iavel; a : integer; b : char; c : real; 0 b 00c4 5d0? a := 0; c 00c4 5d0 00c4 5d04? 00c4 5d06? Pascal é uma linguagem fortemente tipada. Suas iáveis dos tipos byte e char, por exemplo, têm o mesmo tamanho, mas seus conteúdos são interpretados de forma distinta. O tipo byte é usado para armazenar números, enquanto o tipo char é usado para armazenar caracteres. A linguagem não permite que iáveis do tipo byte sejam usadas em funções (e procedimentos) criadas para manipular caracteres. Da mesma forma, não é permitido que iáveis do tipo char sejam usadas em funções (e procedimentos) criadas para manipular números, nem em expressões aritméticas. Qualquer um desses usos inadequados irá resultar em um erro de compilação. C é uma linguagem fracamente tipada. Não há nenhum outro tipo nativo cujas iáveis tenham o mesmo tamanho das iáveis do tipo char. Variáveis desse tipo podem ser usadas tanto para armazenar caracteres quanto números e cabe ao desenvolvedor garantir que as funções que manipularão essas iáveis interpretarão seu conteúdo de forma adequada. É possível, inclusive, somar o caractere 1 com o caractere ; e o resultado não será o caractere (tipicamente será o caractere c ). Já se o caractere a for somado com o número 1 o resultado, tipicamente, será b 1. Ponteiros Embora exista uma grande mítica em torno deles, os ponteiros não são nada além de mais um tipo de iável. A única diferença está no modo como o compilador interpreta o conteúdo de iáveis desse tipo. Ao invés de interpretar como um caractere, um número inteiro ou um decimal, o conteúdo de ponteiros será interpretado como um endereço de memória. Por isso, que se diz que um ponteiro aponta para uma posição de memória. As linguagens que possuem ponteiros oferecem operadores para permitir que seja acessado o conteúdo da posição de memória que está armazenada em um ponteiro. Adicionalmente, o tipo do ponteiro indica o 1 Foram considerados resultados típicos os que são obtidos quando é usada uma tabela de codificação baseada no ASCII, como é a maioria das utilizadas atualmente. Em linguagens fracamente tipadas um número inteiro ou real pode ser interpretado com um ponteiro e vice-versa.

tamanho e como deve ser interpretado este conteúdo. Essas linguagens oferecem também operadores que indicam o endereço de uma iável. program ponteiros; a, b, c : integer; ptrb, ptrc : ^integer; a := ; ptra := @a; ptrb := @b; ^ptrb := ; c := ^ptra; b 00c4 5d0 00c4 5d0 c 00c4 5d04 ptra 00c4 5d06 00c4 5d08 00ca 5d00 00c4 5d09 ptrb 00c4 5d0a 00c4 5d0b 00c4 5d0c 00c4 5d0 00c4 5d0d Arrays Um array é um conjunto de iáveis de um mesmo tipo. Geralmente elas são dispostas seqüencialmente na memória. Desta forma, supondo que um inteiro ocupe 4 bytes, quando se declara um array de 10 inteiros, se está indicando que o compilador deve reser 40 bytes de memória e interpretar cada 4 bytes como um número inteiro. O nome dado ao array é um rotulo para o endereço da primeira posição do array, ou de um ponteiro para sua primeira posição. O operador que indica as posições dentro do array indica, na verdade, um deslocamento a partir do endereço inicial. program ponteiros; a : array [1..5] of integer; b : integer; for b := 1 to 5 do a[b] := b * ; 00c4 5d0 00c4 5d0 4 00c4 5d04 6 00c4 5d06 8 00c4 5d08 00c4 5d09 10 b 00c4 5d0a 00c4 5d0b 1 4 5 00c4 5d0c? 00c4 5d0d?

Alocação de Memória Como já foi visto, para toda iável e todo array declarado no seu programa o compilador separa um espaço na memória onde o conteúdo será armazenado. O tamanho total desse espaço deve ser conhecido no momento que o código for compilado. Sempre que o programa for carregado na memória esse espaço será reservado. Esta alocação é chamada estática. Passagem de Parâmetros Os parâmetros passados para uma função (ou procedimento) são a comunicação de quem está chamando a função para a função. Devem estar na lista de parâmetros todas as informações que a função deve receber para funcionar de forma genérica. Embora, em teoria, essa comunicação possa se dar através de iáveis globais, essa não é considerada uma boa prática pois deixa o código mais confuso e dificulta o reaproveitamento de código. Variáveis locais, que são usadas internamente para a operação da função e não tem sentido fora dela, não devem estar na lista de parâmetros. Por outro lado, os parâmetros declarados já são iáveis locais da sua função e não podem ser redeclarados no corpo dela. A comunicação de volta da função para quem a chamou costuma se dar através de um valor de retorno. No Pascal, este valor é definido em uma iável com o mesmo nome da função. Diferentemente de Pascal, a maioria das linguagens não faz distinção entre funções e procedimentos, considerando um procedimento como uma função que não retorna valor algum. Por esse motivo, as explicações serão dadas com base em funções, mas, com exceção do valor de retorno, tudo se aplica de forma idêntica aos procedimentos.

program ponteiros; function somatorio( a : array of integer; i : integer; limite : integer) : integer; i : integer; limite : integer; somatorio := 0; for i := 0 to limite -1 do somatorio := somatorio + a[i]; end; a : array[0..] of integer; b : integer; a[0] := 4; a[1] := 7; a[] := ; b := ; b := somatorio(a, b); Existem duas formas de passagem de parâmetros. A passagem por valor consiste em copiar o valor de uma iável (ou constante) para o parâmetro correspondente na função. Esta correspondência costuma se dar pela ordem dos parâmetros na declaração e na chamada da função. 4 Caso a função altere o valor dos parâmetros ela estará manipulando uma iável completamente diferente, logo, essa alteração não terá reflexo em quem chamou a função. Já na passagem por referência a função não recebe o valor da iável, mas sua referência, ou seja o local onde ela está armazenada. Desta forma, ao invés de se criar uma iável nova, se está dando apenas um novo nome para a iável que já existe. Esse nome é válido apenas dentro da função, mas permite que ela manipule diretamente a iável original. Caso a função altere o valor de um parâmetro passado por referência, a alteração acontece também onde a função foi chamada. Desta forma a passagem por referência serve também como uma comunicação indireta da função para quem a chamou. 4 Algumas linguagens trabalham com parâmetros nomeados, não importando a ordem com que eles são passados.

program ponteiros; procedure s1(x, y, z : integer); z := x + y; end; procedure s(x, y : integer; z : integer); z := x + y; end; a, b, c, d : integer; a := ; b := ; s1(a, b, c); s(a, b, d); s1.x 00c4 5d00 s1.y 00c4 5d0 00c4 5d0 s1.z 00c4 5d04 5 s.x 00c4 5d06 s.y 00c4 5d08 00c4 5d09 a 00c4 5d0a 00c4 5d0b b 00c4 5d0c 00c4 5d0d c 00c4 5d0e 00c4 5d0f? s.z d 00c4 5d10 00c4 5d11 5