Buscar

Introdução a Ponteiros em C/C++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

LAPRO	I
Prof.	Dr.	Rafael	Garibotti
Pontifícia	Universidade	Católica	do	Rio	Grande	do	Sul	
Faculdade	de	Informática	- FACIN
v Baseado no	material	cedido pelos Profs.	Dr.	Marco	Mangan e	Dr.	Matheus	Trevisan
PONTEIROS
AULA	SOBRE:
INTRODUÇÃO
1
Ponteiro: variável	que	armazena	um	endereço	de	memória	de	outra	variável.
ü Contém	endereço	de	memória	como	seu	valor.
Ø Exemplos:
// Endereço de variável
#include<stdio.h>
int main(void){
int var = 500;
printf("Endereço = %d", var);
return 0;
}
// Uso de um ponteiro
#include<stdio.h>
int main(void){
int var = 500;
int* varPtr;
varPtr = &var;
return 0;
}
INTRODUÇÃO
2
Ø 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	variável,	permite	recuperar	o	
endereço desta	variável.
ü Exemplo: mediaPtr = &media;
Ø O	operador	* quando	utilizado	sozinho,	à	esquerda	da	variável,	retorna	o	
conteúdo	do	ponteiro.
ü Exemplo: printf("media= %d", *mediaPtr);
ü Chamado	de	operador	de	desreferência.
VALORES	INICIAIS
3
Ø Boa	prática	de	programação	em	C/C++.
Ø Java	inicia	as	variáveis	como	zero	automaticamente.
ü Em	C/C++	isso	não	é	verdade.
Ø Valor	inicial	de	ponteiros.
ü Iniciar	como	0,	ou	NULL.
ü NULL:	discussão	sobre	usar	0	ou	NULL	em	C++.
• http://www.cplusplus.com/forum/beginner/5604/
TERMINOLOGIA	BÁSICA
4
Ø Operadores	de	referência	e	dereferência.
Ø Exemplo:
#include <stdio.h>
int main(void) {
int var = 500;
int* varPtr = 0;
varPtr = &var;
printf("Valor de var=%d\n",var);
printf("Endereço de var=%d\n",&var);
printf("Conteúdo de varPtr=%d\n",*varPtr);
printf("Endereço de varPtr=%d\n",varPtr);
return 0;
}
ü * é	utilizado	para	dereferência.
• Pode	ser	lido	como	"valor	apontado	por..."
ü & é	utilizado	para	referência.
• Pode	ser	lido	como	"endereço	de..."
//	500
//	500
//	1577302904
//	1577302904
PONTEIROS	– MEMÓRIA
5
PONTEIROS	– VETORES
6
Ø Em	C/C++,	um vetor é	um	ponteiro	para	um	tipo	de	dado	
qualquer.
Ø Por	exemplo,	um	vetor	de	inteiros.
ü Criado	com	10	posições
• int numeros[10];
ü Possui	10	espaços	de	armazenamento	de	4	bytes	cada.
ü Totalizando	40	bytes	alocados	em	memória.
PONTEIROS	– VETORES
7
Ø Exemplo:
#include <stdio.h>
int main(void) {
int numeros[10]= {1,2,3,4,5,6,7,8,9,0};
printf("%d\n",numeros);
printf("%d\n",&numeros[0]);
printf("%d\n",*numeros);
return 0;
}
Ø Por	isso	que	passar	vetor	por	parâmetro	em	função	equivale	a	passar	
um	ponteiro,	uma	referência	para	um	endereço	de	memória!
//	0xbf83d3fc
//	0xbf83d3fc
//	1
PONTEIROS	– ARITMÉTICA
8
Ø É possível realizar operações 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));
printf(”%d\n”,*(numeros + 5));
printf(”%d\n”, numeros[5]);
return 0;
}
Ø O	sinal de	`+`	diz ao compilador para	acessar um	elemento a	partir de	5	'itens'	do	tipo
inteiro começando do	endereço do	ponteiro (pnum)	ou vetor (numeros).
//	6
//	6
//	6
PONTEIROS	– ARITMÉTICA
9
Ø 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	– ARITMÉTICA
10
Ø Faça	o	seguinte	teste:
#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;
}
Ø ...	e	depois,	tente:
#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;
}
//	4		9		12 //	4		5		6
Ø Cuidado	com	ponteiros!
VISUALIZANDO	A	MEMÓRIA
11
Ø 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;
}
VISUALIZANDO	A	MEMÓRIA
12
ü 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
VETORES	DE	PONTEIROS
13
Ø Em C/C++	é possível 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;
}
VETORES	DE	PONTEIROS
14
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
[0] ‘D’ ‘e’ ‘b’ ‘i’ ‘a’ ‘n’ \0
[1] ‘U’ ‘b’ ‘u’ ‘n’ ‘t’ ‘u’ \0
[2] ‘O’ ‘p’ ‘e’ ‘n’ ‘S’ ‘u’ ‘s’ ‘e’ \0
[3] ‘F’ ‘e’ ‘d’ ‘o’ ‘r’ ‘a’ \0
[4] ‘L’ ‘i’ ‘n’ ‘u’ ‘x’ ‘	’ ‘M’ ‘i’ ‘n’ ‘t’ \0
[5] ‘M’ ‘a’ ‘n’ ‘d’ ‘r’ ‘i’ ‘v’ ‘a’ \0
ARGUMENTOS	DE	PROGRAMA
15
Ø Em C/C++	pode-se	usar a	linha de	comando para	recuperar os
argumentos passados ao programa.
Ø Utilizam-se	duas estruturas básicas:
ü int argc:	total	de	argumentos passados
ü char	*argv[]:	ponteiro para	strings
Ø A	funçãomain	principal	pode ser declarada das	seguintes maneiras:
ü int main (int argc, char *argv[]) {}
ü int main (int argc, char **argv) {}
ARGUMENTOS	DE	PROGRAMA
16
Ø 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]));
}
}
ALOCAÇÃO	DINÂMICA
ALOCAÇÃO	DINÂMICA
17
Ø Alocação estática.
ü int num;
ü char v[10];
Ø E	quando a	quantidade de	memória a	alocar for	conhecida somente em
tempo	de	execução?
ü ptr=malloc(tam);
ü free(ptr);
Ø Essas funções usam a	seguinte biblioteca:	stdlib
ü #include <stdlib.h>
ALOCAÇÃO	DINÂMICA
18
Ø Qual o	tamanho dos	valores a	serem armazenados?
ü Função 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 endereço inicial
for(i=0; i<qtd; i++, ptr++)
scanf ("%d", ptr); // Guarda o conteúdo e avança o endereço
ptr = aux; // Retorna a referência do endereço inicial
for(i=0; i<qtd; i++, ptr++)
printf("%d", *ptr);
free(ptr);
return 0;
}
ALOCAÇÃO	DINÂMICA
19
Ø E	com	tipos definidospelo 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;
}
ALOCAÇÃO	DINÂMICA
20
Ø 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;
}
ATIVIDADE
LABORATÓRIO
21
Ø As	atividades	do	laboratório	da	aula	de	hoje	estão no	Moodle.

Outros materiais