Professional Documents
Culture Documents
Ponteiros
Ponteiros
1000 1003
1001
1002
1003
1004
1005
1006
x é um variável inteira
y é um ponteiro para um inteiro
1000 0 x
y = &x; ... ... ...
1050 1000 y
1000 0 x
y = &x; ... ... ...
1050 1000 y
1000 10 x
x = 10; ... ... ...
1050 1000 y
1000 0 x
y = &x; ... ... ...
1050 1000 y
1000 10 x
x = 10; ... ... ...
1050 1000 y
1000 10 x
printf("%d", *y); ... ... ... *y
1050 1000 y
Prof. Roberto Pinheiro Introdução à Programação (CC0001 e MC0004) 11
Acesso
E nesse exemplo...
int x = 10;
int *pi, *pj;
pi = &x;
pj = pi;
(*pi)++;
(*pj)++;
printf("%d", x);
O que vai ser impresso?
1000 2 x
1001 4
1002 6 .
printf("%d\n", *(y+3)); 1003 8 .
// igual: y[3] 1004 10 .
*(y+3)
...
1050 1000 y
Prof. Roberto Pinheiro Introdução à Programação (CC0001 e MC0004) 23
Aritmética
1000 2 x
int x[5] = {2,4,6,8,10}; 1001 4
int *y; 1002 6 .
y = x; 1003 8 .
1004 10 .
...
1050 1000 y
1000 2 x
1001 4
1002 6 .
printf("%d\n", *(y+3)); 1003 8 .
// igual: y[3] 1004 10 .
*(y+3)
...
1050 1000 y
Prof. Roberto Pinheiro Introdução à Programação (CC0001 e MC0004) 24
Exemplo
0x00000000 ?
Cada célula de memória 0x00000001 ?
possui espaço para um byte 0x00000002 ?
e o endereçamento varia de 0x00000003 ?
acordo com a arquitetura 0x00000004 ?
0x00000005 ?
?
por isso os endereços são 0x00000009
0x0000000A ?
representados por 8 0x0000000B ?
números em hexadecimal 0x0000000C ?
Em 1 hexadecimal cabem 4 0x0000000D ?
bits 0x0000000E ?
25
Relembrando... 0x00000009 ?
0x0000000A ?
Tipo Espaço em Memória
0x0000000B ?
int 2 bytes
0x0000000C ?
long int 4 bytes 0x0000000D ?
char 1 byte 26
0x0000000E ?
float 4 bytes 0x0000000F ?
double 8 bytes 0x00000010 ?
Relembrando... 0x00000009 ?
0x0000000A ?
Tipo Espaço em Memória
0x0000000B ?
int 2 bytes
0x0000000C ?
long int 4 bytes 0x0000000D ?
char 1 byte 27
0x0000000E ?
float 4 bytes 0x0000000F ?
double 8 bytes 0x00000010 ?
0x00000006 ?
float c; 0x00000007 ?
0x00000008 ?
0x00000009 ?
0x00000009 ?
b = 'P'; P é 01010000 em ASCII 0x0000000A ?
0x0000000B ?
c = &b; 0x0000000C ?
Temos a memória ao lado 0x0000000D ?
30
alocada 0x0000000E
0x0000000F
?
?
0x00000010 ?
Operações inválidas
Somar ponteiros
Usar multiplicação ou divisão com ponteiro
Operar ponteiros com double ou float
Exemplo
void *pv;
int n = 10;
float f = 3.5;
pv = &n;
printf("Inteiro: %d\n", *(int *)pv);
pv = &f;
printf("Real: %f\n", *(float *)pv);
int main () {
int x[10], i, *p;
for (i = 0 ; i < 10 ; i++) {
scanf("%d", &x[i]);
}
p = x + 9; // Por que não 10?
for (i = 0 ; i < 10 ; i++) {
printf("%d ", *p);
p--;
}
return 0;
}
return 0; 0x0000000E ?
} 0x0000000F ?
0x00000010 ?
return 0; 0x0000000E ?
} 0x0000000F ?
0x00000010 ?
int main(){
float **v;
int i, j, n, m;
scanf("%d", &n); // Linhas
scanf("%d", &m); // Colunas
v = (float **)malloc(n * sizeof(float *));
for (i = 0 ; i < n ; i++)
v[i] = (float *)malloc(m * sizeof(float));
return 0;
}