Escolar Documentos
Profissional Documentos
Cultura Documentos
estruturas de dados I
Ponteiros
Elverton Fazzion
Endereço Conteúdo
6612 891
6613 'a'
6614 8
6615 16.1
6616 0.4543
6617 298347
Variável Endereço
idade 6614
salario 6612
frac 6615
Variável Endereço
Endereço de
idade 6614 memória em
variável usada que o conteúdo
salario 6612
no programa da variável
frac 6615 está
armazenado
Endereço Conteúdo
6612 891
Variável Endereço
6613 'a'
idade 6614
6614 8
salario 6612
6615 16.1
frac 6615 6616 0.4543
6617 298347
#include <stdio.h>
int main(){
int x = 3;
printf("%d %p\n", x, &x);
return 0;
}
Valor Endereço
em
Hexadecimal
Imprime o valor de um
ponteiro!
y 0022FF74 3 x
0022FF76 0022FF74
#include <stdio.h>
int main(){
NULL é um valor que indica que o
short int *y = NULL;
ponteiro está apontando pra “nada”
short int x = 3;
y = &x;
Podemos fazer verificações como
printf("%p %p\n", &x, y);
if (pointer == NULL)
return 0;
}
y recebe o endereço de x
0022FF76 0022FF74
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y NULL
printf("%d %d\n", x, *y);
return 0;
}
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74 x 3
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y NULL
printf("%d %d\n", x, *y);
return 0;
}
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74 x 3
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y 0022FF74
printf("%d %d\n", x, *y);
return 0;
}
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74 x 3
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y 0022FF74
printf("%d %d\n", x, *y);
return 0;
}
O que será impresso?
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74 x 5
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y 0022FF74
printf("%d %d\n", x, *y);
return 0;
} Modifica o conteúdo dos endereços 0022FF74 e
0022FF74 para 5. Isso porque y é ponteiro para
short int, então são modificados apenas 2 bytes
a partir do endereço 0022FF74
#include <stdio.h>
Endereço Variável Conteúdo
int main(){
short int *y = NULL; 0022FF74 x 5
short int x = 3;
y = &x; 0022FF75
printf("%d %d\n", x, *y);
*y = 5;
0022FF76 y 0022FF74
printf("%d %d\n", x, *y);
return 0;
}
O que será impresso?
#include <stdio.h>
int main(){
int *p = 0x5DC;
printf(“Hex=%p\n”, p);
p++;
printf(“Hex=%p\n”, p);
p++; O incremento foi de 4 bytes pois o
printf(“Hex=%p\n”, p);
tipo do ponteiro é int (4 bytes)
return 0;
}
#include <stdio.h>
int main(){
int x = 9;
printf("%d\n", x);
zera_inteiro(&x);
printf("%d\n", x);
return 0;
}
#include <stdio.h>
int main(){
void *ponteiro = NULL; Não se sabe o
int p2 = 10;
tipo apontado!
ponteiro = &p2;
printf(“Conteúdo: %d\n”, *ponteiro); // ERRO
printf(“Conteúdo: %d\n”, *(int*)ponteiro);
return 0;
}
#include <stdio.h>
int main(){
void *p = 0x5DC;
printf("Hex=%p\n", p);
p++;
printf("Hex=%p\n", p);
p++;
printf("Hex=%p\n", p);
return 0; O incremento pulou 1 byte pois o
} tipo do ponteiro é void
#include <stdio.h>
int main(){
printf("%lu %lu %lu %lu %lu\n",
sizeof(int *),
sizeof(double *),
sizeof(char *),
sizeof(float *),
sizeof(void*)
);
return 0;
}
int main(){
Declarando um ponteiro para um
int ** x2 = NULL;
ponteiro do tipo int *
int * x1 = NULL;
int x = 5;
x1 = &x;
x2 = &x1; Recebendo o endereço de um ponteiro do tipo int *
printf("%d\n", **x2); Imprimindo o conteúdo da variável x a partir de x2
printf("%p %p\n",
*x2, &x); Imprimindo o conteúdo de x1, que é o endereço de x
return 0;
}
0022FF74 0022FF72 3
z y x
Precedência
* / % Operadores multiplicativos Esquerda para direita
#include <stdio.h>
int main(){
int * p = NULL;
int x = 5;
p = &x;
printf("%d\n", *(*(&p)));
return 0;
}
#include <stdio.h>
int main(){
int * p = NULL;
int x = 5;
p = &x;
printf("%d\n", *(*(&p)));
return 0;
}
p 0022FF74 3 x
0022FF76 0022FF74
#include <stdio.h>
int main(){
int * p = NULL;
int x = 5;
p = &x;
printf("%d\n", *(*(&p)));
return 0;
}
p 0022FF74 3 x
0022FF76 0022FF74
#include <stdio.h>
int main(){
int * p = NULL;
int x = 5;
p = &x;
printf("%d\n", *(*(&p)));
return 0;
}
p 0022FF74 3 x
0022FF76 0022FF74
#include <stdio.h>
int main(){
int * p = NULL;
int x = 5;
p = &x;
printf("%d\n", *(*(&p)));
return 0;
}
p 0022FF74 3 x
0022FF76 0022FF74
#include <stdio.h>
int main(){
int N = 0x494A4C4D;
char *p = (char*)&N;
printf("%c\n", *p);
p++;
printf("%c\n", *p);
p++;
printf("%c\n", *p); ➔ Dois dígitos hexadecimal tem 1 byte
p++;
printf("%c\n", *p); ➔ Um inteiro tem 4 bytes
return 0;
}
➔ Podemos compor um inteiro usando 8
dígitos hexadecimal
#include <stdio.h>
int main(){
int N = 0x494A4C4D;
char *p = (char*)&N;
printf("%c\n", *p);
p++;
printf("%c\n", *p);
p++;
printf("%c\n", *p);
p++;
printf("%c\n", *p);
return 0;
}
Elverton Fazzion