PROGRAMAÇÃO ESTRUTURADA II Profª. Noeli Ciência da Computação 1 PONTEIROS Continuação... CIÊNCIA DA COMPUTAÇÃO Relembrando Ponteiros... Um ponteiro é um tipo especial de variável cujo valor é um endereço. Para declararmos um ponteiro para um inteiro utilizamos a seguinte sintaxe: int * p; p é uma variável que armazena endereço de memória. Dentro do código *p é o conteúdo de p, ou seja, o valor armazenado no objeto cujo endereço é p . Exemplo: int *p, x = 10; p = &x; printf(“%d”,*p); CIÊNCIA DA COMPUTAÇÃO Relembrando Ponteiros... p x 89422 90001 10 p = &x *p é 10 CIÊNCIA DA COMPUTAÇÃO 89422 p Aritmética com Ponteiros Se pi é um ponteiro para um inteiro, então pi + 1 é o ponteiro para o inteiro imediatamente seguinte ao inteiro *pi na memória. pi – 1 é o ponteiro para o inteiro imediatamente anterior a *pi; pi + 2 é o o ponteiro para o segundo inteiro depois de *pi e assim por diante; CIÊNCIA DA COMPUTAÇÃO Aritmética com Ponteiros Por exemplo: Suponha que determinada máquina use endereçamento de bytes, que um inteiro exija quatro bytes e que o valor de pi seja 100 (pi aponta para o inteiro *pi na posição 100). Sendo assim, o valor de pi – 1 é 96, o valor de pi + 1 é 104 e o valor de pi + 2 é 108. O valor de *(pi - 1) é o conteúdo dos quatro bytes (96,97,98,99), interpretados como um inteiro; O valor de *(pi + 1) é o conteúdo dos bytes 104, 105,106,107, interpretados como inteiro. Aritmética com Ponteiros Atenção: Devemos observar a diferença entre * pi + 1, que se refere a 1 somado ao inteiro *pi, e *(pi + 1), que se refere ao inteiro posterior ao inteiro na posição pi. CIÊNCIA DA COMPUTAÇÃO Vetores e Ponteiros Os elementos de qualquer vetor têm endereços consecutivos na memória do computador. Depois da declaração int v[100]; a variável v é, essencialmente, um ponteiro para o primeiro elemento do vetor. Mais precisamente, v é uma espécie de "ponteiro constante": você não pode mudar o valor de v. CIÊNCIA DA COMPUTAÇÃO Vetores e Ponteiros Como v contém o endereço do primeiro elemento do vetor, a expressão v+1 é o endereço do segundo elemento, v+2 é o endereço do terceiro elemento, etc. Se i é uma variável do tipo int então as expressões v + i e &v[i] têm exatamente o mesmo valor. Portanto, *(v+i) = 87; tem o mesmo efeito que v[i] = 87; CIÊNCIA DA COMPUTAÇÃO Vetores e Ponteiros - Exemplo #include <stdio.h> #include <stdlib.h> #define x 10 void main() { int i, v[x]; printf("\nInforme %d valores inteiros: ",x); for(i=0; i < x; i++) { scanf("%d", v + i);//leitura utiliznado o ponteiro v } printf("\nMostrando os elementos\n"); for(i=0; i < x; i++) { printf("%d\n", *(v + i)); //mostrando os elementos através de v } system("PAUSE"); } Ponteiros Usaremos ponteiros para: •Passagem de parâmetros para funções; •Alocação dinâmica de memória. CIÊNCIA DA COMPUTAÇÃO Passagem de Parâmetros por Referência Para poder atuar/alterar o valor original, a função, tem que receber o parâmetro por referência, ou seja, a função/procedimento tem que receber uma referência ao endereço de memória da variável passada como parâmetro e não uma simples cópia do valor da variável. Ao receber um parâmetro por referência, as alterações que a função/procedimento fizer, serão feitas diretamente na variável original, pois agora, a função/procedimento tem acesso ao endereço da variável na memória e não mais apenas uma cópia do seu valor. CIÊNCIA DA COMPUTAÇÃO Exemplo – Passagem de parâmetro por referência #include <stdlib.h> #include <stdio.h> void troca(float *pa, float *pb) { float aux; aux = *pa; *pa = *pb; *pb = aux; } void main() { float a,b; printf("\nDigite dois valores: "); scanf("%f %f",&a,&b); printf("\na = %2.0f\nb = %2.0f",a,b); troca(&a,&b); printf("\nDepois de efetuada troca com a utilização de ponteiros..."); printf("\na = %2.0f \nb = %2.0f\n\n", a, b); system("PAUSE"); } Concluindo • Na passagem por valor é passado apenas uma cópia do valor da variável. • Os comandos executados dentro do proc./função chamado não irão alterar o valor original da variável. •Já na chamada por referência, o endereço da variável, na memória, é passado para o procedimento/função que foi chamado. Com isso, as alterações feitas pelo procedimento, na variável, irão alterar o valor original da variável, pois estão atuando diretamente sobre esta variável, ou melhor, no endereço de memória da variável. CIÊNCIA DA COMPUTAÇÃO EXERCÍCIO 1 - Elabore um programa que declare 4 variáveis do tipo inteiro e 4 do tipo ponteiro de inteiro, e faça com que as variáveis ponteiro apontem para as variáveis inteiro. Coloque comandos que permitam modificar os valores das variáveis inteiras através das variáveis ponteiro. Faça a simulação passo-a-passo para visualizar o que está acontecendo em cada linha do programa. CIÊNCIA DA COMPUTAÇÃO