Microsoft PowerPoint - Aula 02 - PONTEIRO

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 18

Estrutura de Dados II

Aula 02 - Ponteiro
Prof. Esp.: Paulo Roberto Freitas Rodrigues
Endereços
• A memória do computador é uma seqüência de bytes. Cada byte
armazena um de 256 possíveis valores.
• Cada objeto na memória do computador ocupa um certo numero de
bytes consecutivos.
• Uma char ocupa 1 byte, um int ocupa 4 bytes e um double ocupa 8 bytes.

• Cada objeto na memória tem um endereço.


Exemplo de tamanho do tipo de variável
usando o função sizeof()
()
#include <stdio.h>

main(){

int tamanhoINT = sizeof(int);


);
int tamanhoDOUBLE = sizeof(double);
sizeof
int tamanhoCHAR = sizeof(char
char);

printf("Tamanha do INT: %d\\n", tamanhoINT);


printf("Tamanha
("Tamanha do DOUBLE: %d\n",
%d tamanhoDOUBLE);
printf("Tamanha
("Tamanha do CHAR: %d\n",
%d tamanhoCHAR);

}
Endereços
• O endereço de uma variável é dados pelo operador &.
• Não confunda o uso de “&” com o operador AND, que em C se
escreve “&&”.

• Se i é uma variável então &i é seu endereço.


Exemplo#include
do endereço
<stdio.h>
de variáveis.
main(){
int inteiro = 5;
double decimal = 0.5;
char letra = 'v';

printf("Conteudo da Variavel:
Variavel %d\n", inteiro);
printf("Endereco da Variavel:
Variavel %d\n", &inteiro);

printf("Conteudo da Variavel:
Variavel %.2f\n", decimal);
printf("Endereco da Variavel:
Variavel %d\n", &decimal);

printf("Conteudo da Variavel:
Variavel %c\n", letra);
printf("Endereco da Variavel:
Variavel %d\n", &letra);
}
Ponteiros
• Um ponteiro é simplesmente uma variável que armazena o
endereço de outra variável.

• O ponteiro é um tipo de dado como int, char ou float.

• Um ponteiro aponta para algo. Em programação, temos as


variáveis armazenadas na memória, e um ponteiro aponta para
um endereço de memória.

• Imagine as variáveis como documentos, a memória do


computador pastas para guardar os documentos, e o ponteiro
como atalhos para as pastas.
Declaração de Ponteiros
• Para declarar um ponteiro, especificamos o tipo da variavel para a
qual ele aponta e seu nome precedido por asterisco. Pode-se
Pode ter um
ponteiro para qualquer tipo de variaveis possivel em C.
• Não confuda o uso de “*” com o operador de multiplicação.

• Tipo *variavel;
• int *a; /*ponteiro para inteiro*/
• char *a; /*ponteiro para char*/
char
• Ffoat *a; /*ponteiro para float*/
float
Exemplo de Apontador
#include <stdio.h>

main(){

int inteiro = 5;
int *pInteiro = &inteiro;

printf("Conteudo da Variavel:: %d\n",


%d inteiro);
printf("Endereco da Variavel:: %d\n",
%d &inteiro);
printf("Endereco do apontador: %d\n",
%d pInteiro);

}
Exemplo de apontador
#include <stdio.h>
main(){
int inteiro = 5;
int *pInteiro = &inteiro;

printf("Endereco do apontador: %d\n",


%d pInteiro);
printf("Valor
("Valor do apontador: %d\n",
%d *pInteiro);

*pInteiro = 15;

printf("Endereco do apontador: %d\n",


%d pInteiro);
printf("Valor
("Valor do apontador: %d\n",
%d *pInteiro);
}
Ponteiros como parâmetros de funções
• A função recebe “cópia” das variáveis e troca os valores de cópias, enquanto as
variáveis “originais” permanecem inalteradas.
#include <stdio.h>
void trocar(int i, int j){
int aux = i;
i = j;
j = aux;
}
main(){
int i = 10;
int j = 15;
printf("\nAntes X = %d e J = %d", i, j);
trocar(i, j);
printf("\nDepois X = %d e J = %d", i, j);
}
Ponteiros como parâmetros de funções
• Para obter o efeito desejado, é preciso passar à função os endereços das
variáveis.
#include <stdio.h>
void trocar(int *i, int *j){
int aux = *i;
*i = *j;
*j = aux;
}
main(){
int i = 10;
int j = 15;
printf("\nAntes X = %d e J = %d", i, j);
trocar(&i, &j);
printf("\nDepois X = %d e J = %d", i, j);
}
Operações com Ponteiros
• É possível realizar as operações de soma e subtração do valor do
ponteiro, ou seja, do endereço armazenado na variável.

• A soma estará condicionado ao tamanho do tipo que o ponteiro


aponta. Suponha que exista um ponteiro para um inteiro, que ocupa
4 bytes na memória. Ao se somar uma unidade neste ponteiro (+1) o
compilador interpretara que se deseja soma um valor que permita
acessar o próximo inteiro e ira gera código para somar 4 unidades no
endereço do ponteiro.
Operações com Ponteiros
• Supondo dois ponteiros inicializados p1 e p2;

• P1 = p2;
• Assim p1 aponta para o mesmo lugar que p2. usar p1 será equivalente a usar
p2.

• *p1 = *p2;
• Iguala os valores apontados. Alterar o valor apontado por p1 para o valor
apontado por p2.
Operações com Ponteiros
• p1++;
• Incrementar o ponteiro. Ele passa a apontar para o próximo valor do mesmo
tipo. Se o ponteiro é para um inteiro e é incrementado, passa a apontar para
o próximo inteiro.

• (*p1)++;
• Altera o valor apontado por p. Incrementa o conteúdo da variável apontada
pelo ponteiro p1.
Operações com Ponteiros
#include <stdio.h>
void imprimeMatriz(int *p1){
int i;
for(i=0;i<5;i++){
printf("\nConteudo da Matriz na posicao antes %d=%d", i, *p1);
(*p1)++;
printf("\nConteudo da Matriz na posicao depois %d=%d", i, *p1);
printf("\nEndereco de memoria = %d", p1);
printf("\n");
p1++;
}
}
main(){
int matriz[5] = {6, 7, 8, 9, 10};

imprimeMatriz(matriz);
}
Ponteiros e Strings
#include <stdio.h>

main(){
char nome[100] = "Paulo Roberto";
char *pNome;

pNome = nome;

printf("\nEndereco da 1a posicao = %d\n",


n", pNome);
printf("\nValor da 1a posicao = %c\n\n",
n", *pNome);
*

while(*pNome != NULL){
//putchar(*pNome);
printf("%c", *pNome);
pNome++;
}

printf("\nEndereco da ultima posicao = %d \n", pNome);

}
Exercício

1 – Explique o código a seguir. 2 – Explique o seguinte código.


#include <stdio.h> #include <stdio.h>
main(){ main(){
int i; int i;
int vetorTeste[3] = {4, 7, 1}; int vetorTeste[3] = {4, 7, 1};
int *ptr = vetorTeste; int *ptr = vetorTeste;
printf("%d\n", vetorTeste); i = 0;
printf("%d\n", ptr); while(ptr <= &vetorTeste[2]){
printf("%d\n", &ptr); printf("O endereco do indice %d do vetor e %d\n"
,i, &ptr[i]);
for(i=0;i<3;i++){
printf("O valor do indice %d do vetor e %d\n", i,
printf("O endereco do indice %d do vetor e %d\n" ,i, &ptr[i]);
[i]); ptr[i]);
printf("O valor do indice %d do vetor e %d\n", i, ptr[i]); ptr++;
} i++;
} }
}
Exercícios
screva um programa que declare um inteiro, um real e um char, e ponteiros para
teiro, real e char. Associe as variáveis aos ponteiros (use &). Modifique os valores
ada variável usando os ponteiros. Imprima os valores das variáveis antes e após a
modificação.
screva um programa que contenha duas variáveis inteiras. Leia essas variáveis do
eclado. Em seguida, compare seus endereços e exiba o conteúdo do maior
ndereço.
laborar um programa que leia dois valores inteiros (A e B). Em seguida faça uma
unção que retorne a soma do dobro dos dois números lidos. A função dever
rmazenar o dobro de A na própria variável A e o dobro de B na própria variável B.
rie um programa que contenha uma matriz de float contendo 3 linhas e 3 coluna
mprima o endereço de cada posição dessa matriz.
aça um programa que leia três valores inteiros e chame uma função que receba
stes 3 valores de entrada e retorne eles ordenados, ou seja, o menor valor na
rimeira variável o segundo menor valor na variável do meio, e o maior valor na ´
ltima variável. A função deve retornar o valor 1 se os três valores forem iguais e 0
xistirem valores diferentes. Exibir os valores ordenados na tela.

Você também pode gostar