Anda di halaman 1dari 25

Pontifcia

Universidade Catlica do Rio Grande do Sul


Faculdade de Informtica - FACIN

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..."

* utilizado para dereferncia.


Pode ser lido como "valor apontado por..."

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];

Possui 10 espaos de armazenamento de 4 bytes cada.


Totalizando 40 bytes alocados em memria.

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:

... e depois, tente:

#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

Cuidado com ponteiros!

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];

E quando a quantidade de memria a alocar for conhecida somente em


tempo de execuo?
ptr=malloc(tam);
free(ptr);

Essas funes usam a seguinte biblioteca: stdlib


#include <stdlib.h>
17

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

Anda mungkin juga menyukai