Escolar Documentos
Profissional Documentos
Cultura Documentos
LAPRO I
Prof. Dr. Rafael Garibotti
v Baseado no material cedido pelos Profs. Dr. Marco Mangan e Dr. Matheus Trevisan
AULA SOBRE:
PONTEIROS
INTRODUO
Ponteiro: varivel que armazena um endereo de memria de outra varivel.
Contm endereo de memria como seu valor.
Exemplos:
// Endereo de varivel
#include<stdio.h>
// Uso de um ponteiro
#include<stdio.h>
int main(void){
int var = 500;
printf("Endereo = %d", var);
return 0;
}
int main(void){
int var = 500;
int* varPtr;
varPtr = &var;
return 0;
}
1
INTRODUO
O operador * do lado direito de um tipo qualquer, define um ponteiro para
aquele tipo.
Exemplo: float* mediaPtr;
O operador & do lado esquerdo de uma varivel, permite recuperar o
endereo desta varivel.
Exemplo: mediaPtr = &media;
O operador * quando utilizado sozinho, esquerda da varivel, retorna o
contedo do ponteiro.
Exemplo: printf("media= %d", *mediaPtr);
Chamado de operador de desreferncia.
2
VALORES INICIAIS
Boa prtica de programao em C/C++.
Java inicia as variveis como zero automaticamente.
Em C/C++ isso no verdade.
Valor inicial de ponteiros.
Iniciar como 0, ou NULL.
NULL: discusso sobre usar 0 ou NULL em C++.
http://www.cplusplus.com/forum/beginner/5604/
3
TERMINOLOGIA BSICA
Operadores de referncia e dereferncia.
& utilizado para referncia.
Pode ser lido como "endereo de..."
Exemplo:
#include <stdio.h>
int main(void) {
int var = 500;
int* varPtr = 0;
varPtr = &var;
printf("Valor de
printf("Endereo
printf("Contedo
printf("Endereo
return 0;
}
var=%d\n",var); // 500
de var=%d\n",&var); // 1577302904
de varPtr=%d\n",*varPtr); // 500
de varPtr=%d\n",varPtr); // 1577302904
4
PONTEIROS MEMRIA
PONTEIROS VETORES
Em C/C++, um vetor um ponteiro para um tipo de dado
qualquer.
Por exemplo, um vetor de inteiros.
Criado com 10 posies
int numeros[10];
PONTEIROS VETORES
Exemplo:
#include <stdio.h>
int main(void) {
int numeros[10]= {1,2,3,4,5,6,7,8,9,0};
printf("%d\n",numeros);
// 0xbf83d3fc
printf("%d\n",&numeros[0]); // 0xbf83d3fc
printf("%d\n",*numeros);
// 1
return 0;
}
Por isso que passar vetor por parmetro em funo equivale a passar
um ponteiro, uma referncia para um endereo de memria!
7
PONTEIROS ARITMTICA
possvel realizar operaes sobre ponteiros.
Exemplo:
#include <stdio.h>
int main(void) {
int numeros[10]= {1,2,3,4,5,6,7,8,9,0};
int* pnum = numeros;
printf(%d\n,*(pnum + 5));
// 6
printf(%d\n,*(numeros + 5)); // 6
printf(%d\n, numeros[5]);
// 6
return 0;
}
O sinal de `+` diz ao compilador para acessar um elemento a partir de 5 'itens' do tipo
inteiro comeando do endereo do ponteiro (pnum) ou vetor (numeros).
PONTEIROS ARITMTICA
Estudo de caso:
#include <stdio.h>
#define TAM 10
void teste_vetor3(int *v) {
int *p;
int i;
for (p = v, i = 0; i++ < TAM; p++)
printf(" %d ",*p);
printf("\n");
}
int main(void) {
int vetor[TAM] = { 1,2,3,4,5,6,7,8,9,10 };
teste_vetor3(vetor);
return 0;
}
PONTEIROS ARITMTICA
Faa o seguinte teste:
#include <stdio.h>
#include <stdio.h>
int main(void) {
int vet[] = {4, 9, 12};
int i, *ptr;
ptr = vet;
for(i = 0 ; i < 3 ; i++) {
printf(" %d ",*ptr++);
}
return 0;
}
int main(void) {
int vet[] = {4, 9, 12};
int i, *ptr;
ptr = vet;
for(i = 0 ; i < 3 ; i++) {
printf(" %d ",(*ptr)++);
}
return 0;
}
// 4 9 12
// 4 5 6
10
VISUALIZANDO A MEMRIA
Estudo de caso:
#include <stdio.h>
int main(void) {
int numeros[10]= {1,2,3,4,5,6,7,8,9,0};
int* pnum = numeros;
int i, bytes;
for (i=0, bytes=0; i < 10; ++i, bytes+=4) {
printf("Elemento %d : %d + , i, pnum);
printf(%d bytes = %d, bytes, (pnum+i));
printf(\n);
}
return 0;
}
11
VISUALIZANDO A MEMRIA
Elemento 0: 0xbfa5ce0c + 0 bytes = 0xbfa5ce0c
Elemento 1: 0xbfa5ce0c + 4 bytes = 0xbfa5ce10
Elemento 2: 0xbfa5ce0c + 8 bytes = 0xbfa5ce14
Elemento 3: 0xbfa5ce0c + 12 bytes = 0xbfa5ce18
Elemento 4: 0xbfa5ce0c + 16 bytes = 0xbfa5ce1c
Elemento 5: 0xbfa5ce0c + 20 bytes = 0xbfa5ce20
Elemento 6: 0xbfa5ce0c + 24 bytes = 0xbfa5ce24
Elemento 7: 0xbfa5ce0c + 28 bytes = 0xbfa5ce28
Elemento 8: 0xbfa5ce0c + 32 bytes = 0xbfa5ce2c
Elemento 9: 0xbfa5ce0c + 36 bytes = 0xbfa5ce30
12
VETORES DE PONTEIROS
Em C/C++ possvel criar vetores de ponteiros.
Exemplo:
#include <stdio.h>
int main(void) {
char *linuxDistro[6] = { "Debian", "Ubuntu",
"OpenSuse","Fedora", "Linux Mint", "Mandriva"};
for ( int i=0; i < 6; i++)
printf("%s", linuxDistro[i]);
return 0;
}
13
VETORES DE PONTEIROS
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[0]
\0
[1]
\0
[2]
\0
[3]
\0
[4]
[5]
\0
[9]
[10]
\0
14
ARGUMENTOS DE PROGRAMA
Em C/C++ pode-se usar a linha de comando para recuperar os
argumentos passados ao programa.
Utilizam-se duas estruturas bsicas:
int argc: total de argumentos passados
char *argv[]: ponteiro para strings
A funo main principal pode ser declarada das seguintes maneiras:
int main (int argc, char *argv[]) {}
int main (int argc, char **argv) {}
15
ARGUMENTOS DE PROGRAMA
Exemplo:
#include <stdio.h>
int main (int argc, char *argv[]) {
if (argc < 2)
printf(Quantidade de argumentos invalida!");
else{
//resto do programa
printf(Eu sou o programa %s - param %d ", argv[0],
atoi(argv[1]));
}
}
16
ALOCAO DINMICA
ALOCAO DINMICA
Alocao esttica.
int num;
char v[10];
ALOCAO DINMICA
Qual o tamanho dos valores a serem armazenados?
Funo sizeof (tipo)
Exemplo:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int *ptr, *aux, qtd, i;
printf("Quantos nros vc vai digitar?");
scanf ("%d", &qtd);
ptr = malloc(qtd * sizeof(int));
aux = ptr;
// Guarda o endereo inicial
for(i=0; i<qtd; i++, ptr++)
scanf ("%d", ptr);
// Guarda o contedo e avana o endereo
ptr = aux;
// Retorna a referncia do endereo inicial
for(i=0; i<qtd; i++, ptr++)
printf("%d", *ptr);
free(ptr);
return 0;
}
18
ALOCAO DINMICA
E com tipos definidos pelo programador?
Exemplo:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int dia, mes, ano;
} data;
int main (void) {
data *d;
d = malloc( sizeof (data));
d->dia = 1;
d->mes = 12;
d->ano = 2015;
printf("%d %d %d\n", d->dia, d->mes, d->ano);
free(d);
return 0;
}
19
ALOCAO DINMICA
E com vetores?
Exemplo:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int *v;
int n, i;
scanf( "%d", &n);
v = malloc( n * sizeof (int));
for (i = 0; i < n; ++i)
scanf( "%d", &v[i]);
for (i = n; i > 0; --i)
printf( "%d ", v[i-1]);
free(v);
return 0;
}
20
ATIVIDADE
LABORATRIO
As atividades do laboratrio da aula de hoje esto no Moodle.
21