Академический Документы
Профессиональный Документы
Культура Документы
Ponteiros
¥ um ponteiro Ž uma vari‡vel que contŽm o
endere•o um dado
¥ declara•‹o: Ò*Ó indica que a vari‡vel Ž um
ponteiro
tipo_dado *nome_ponteiro;
¥ Ex:
int x;
int *pi; /* compilador sabe que pi Ž ponteiro */
/* pi Ž um ponteiro para inteiro */
1
Ponteiros
Ponteiros
void main () {
int *tmp_ptr;
0xABA0 10 x
int x, y;
x = 10; 0xABA2 10 y
tmp_ptr = &x;
y = *tmp_ptr; /* (*tmp_ptr) = 10 */
}
Linguagem C Ricardo Jacobi
2
Ponteiros
¥ ponteiros s‹o vari‡veis tipadas:
(int *) - (float *) - (char *)
¥ Ex:
main() {
int *ip, x;
float *fp, z;
ip = &x; /* OK */
fp = &z; /* OK */
ip = &z; /* erro */
fp = &x; /* erro */
}
Ponteiros
1 byte 1 byte
(int *) (float *)
(char *)
3
Utilizando Ponteiros
void main() {
int x = 10;
int *pi;
pi = &x; /* *pi == 10 */
(*pi)++; /* *pi == 11 */
printf(“%d”, x);
}
==> 11
Utilizando Ponteiros
void main() {
int x = 10;
int *pi, *pj;
pi = &x; /* *pi == 10 */
pj = pi; /* *pj == 10 */
(*pi)++; /* (*pi, *pj, x) == 11 */
(*pj)++; /* (*pi, *pj, x) == 12 */
printf(“%d”, x); /* ==> 12 */
}
4
Prática 1
Arrays
¥ arrays s‹o agrupamentos de dados
adjacentes na mem—ria
¥ declara•‹o:
tipo_dado nome_array[<tamanho>];
5
Arrays
¥ Ex:
float m[10], *pf;
pf = m;
4 BYTES
m:
m[0] m[1] m[9]
pf:
Referenciando Arrays
m = n; /* erro: m é constante ! */
pf = m; /* ok */
6
Referenciando Elementos
Referenciando Elementos
pf = &m[2];
printf(“%f”, *pf); /* ==> 5.75 */
7
Referenciando Elementos
¥ Pode-se utilizar ponteiros e colchetes:
Aritmética de Ponteiros
¥ ƒ poss’vel fazer opera•›es aritmŽticas e
relacionais entre ponteiros e inteiros
¥ Soma: ao somar-se um inteiro n a um ponteiro,
endere•amos n elementos a mais (n positivo)
ou a menos (n negativo)
pf[2] equivale a *(pf+2)
*(pf + n) endereça n elementos a frente
*(pf - n) endereça n elementos atrás
pf++ endereça próximo elemento array
pf-- endereça elemento anterior array
8
Exemplo
void main ()
{
int arint[] = { 1,2,3,4,5,6,7 };
int size = 7; /* tamanho do array */
int i, *pi;
==> 1 2 3 4 5 6 7
Exemplo - variação
void main ()
{
int arint[] = { 1,2,3,4,5,6,7 };
int size = 7; /* tamanho do array */
int i, *pi;
==> 1 2 3 4 5 6 7
9
Exemplo - variação
void main () {
int arint[] = { 1,2,3,4,5,6,7 };
int size = 7; /* tamanho do array */
int i, *pi;
pi = arint;
printf(“ %d “, *pi); pi += 2;
printf(“ %d “, *pi); pi += 2;
printf(“ %d “, *pi); pi += 2;
printf(“ %d “, *pi);
}
==> 1 3 5 7
10
Prática 2
Cuidados...
11
Cuidados...
void main ()
{
int arint[] = { 1,2,3,4,5,6,7 };
int size = 10;
int i;
Cuidados...
12
Ponteiros Genéricos
¥ Um ponteiro genŽrico Ž um ponteiro que
pode apontar para qualquer tipo de dado
¥ Define-se um ponteiro genŽrico utilizando-se
o tipo void:
void *pv;
int x=10;
float f=3.5;
pv = &x; /* aqui pv aponta para um inteiro */
pv = &f; /* aqui, para um float */
Ponteiros Genéricos
pv = &x;
printf(“Inteiro: %d\n”, *(int *)pv); /*=> 10*/
pv = &f;
printf(“Real: %f\n”, *(float *)pv); /*=> 3.5*/
13
Ponteiros e Strings
Ponteiros e Strings
14
Ponteiros e Strings
¥ varia•‹o de strcpy:
Arrays Multidimensionais
15
Array de Caracteres
void main () {
char matriz[5][10];
char *pc;
int i;
Array de Caracteres
¥ Percorrendo array com ’ndices:
void main () {
char matriz[5][10];
int i, j;
16
Array de Inteiros
¥ Exemplo: considere o problema de
convers‹o de data dia_do_ano: um dos 365
dias do ano, convertido a partir do mes e dia
do mes
¥ Tabela que indica dias dos meses incluindo
bissexto
static char tabela_dias[2][13] =
{
{ 0,31,28,31,30,31,30,31,31,30,31,30,31 }
{ 0,31,29,31,30,31,30,31,31,30,31,30,31 }
};
Linguagem C Ricardo Jacobi
Conversão de Data
0 31 28 31 30 31 31 30 31 30 31 30 31
0 31 29 31 30 31 31 30 31 30 31 30 31
memória
0 31 28 31 ... 0 31 28 31 ... 31 30 31
17
Conversão de Data
Array de Strings
18
Array de Strings
void main() {
19
Ponteiros para Ponteiros
pc = “teste”;
ppc = &pc;
putchar(**ppc); /* ==> ‘t’ */
20