Escolar Documentos
Profissional Documentos
Cultura Documentos
Agenda
1 Ponteiros
3 Alocação de Vetores
4 Alocação de Matrizes
5 Alocação de Estruturas
Ponteiro
Um ponteiro é um endereço de memória. Seu valor indica
onde uma variável está armazenada, não o que está
armazenado. Um ponteiro proporciona um modo de acesso a
uma variável sem referência-la diretamente.
Exemplo
O que é o ponteiro de um relógio? É o que aponta para as
horas, minutos ou segundos. Um ponteiro aponta para algo.
Em programação, temos as variáveis armazenadas na
memória, e um ponteiro aponta para um endereço de memória.
Endereços de Memória
A memória de seu computador é dividida em bytes , e estes bytes são
numerados de 0 até o limite de sua maquina. Estes números são
chamados endereços de bytes. Um endereço é a referência que o
computador usa para localizar variáveis.
Toda variável ocupa certa localização na memória, e seu endereço é o
do primeiro byte ocupado por ela.
1 #include <stdio.h>
2 int main(){
3 int i, j, k;
4 printf("%p\n%p\n%p\n",&i,&j,&k);
5 return 0;
6 }
Resultado
0028FF1C
0028FF18
0028FF14
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Ponteiros Alocação Dinâmica de Memória Alocação de Vetores Alocação de Matrizes Alocação de Estruturas
Declarando Ponteiros
Um ponteiro, como qualquer variável, deve ter um tipo, que
é o tipo da variável para a qual ele aponta.
Para declarar um ponteiro, especificamos o tipo da
variável para a qual ele aponta e seu nome precedido por
asterisco:
Declarando Ponteiros
Para atribuir um valor ao ponteiro, usamos apenas seu
nome de variável. Esse valor deve ser um endereço de
memória, portanto obtido com o operador &:
1 int a;
2 int *p;
3 p = &a;
1 int *p = &a;
Declarando Ponteiros
1 #include <stdio.h>
2 int main(){
3 int i = 10 ;
4 int *p = &i ;
5 *p = 5 ;
6 printf ("%d\t%d\t%p\n", i, *p, p);
7 return 0;
8 }
5 5 0028FF18
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Ponteiros Alocação Dinâmica de Memória Alocação de Vetores Alocação de Matrizes Alocação de Estruturas
Ponteiro e NULL
Uma falha de segmentação ou em inglês (segmentation
fault) ocorre quando um programa tenta acessar um
endereço na memória que está reservado ou que não
existe.
Aqui o ponteiro contem NULL, definido com o endereço
(0x00000000) que causa uma falha de segmentação.
É sempre bom inicializarmos os ponteiros, pois senão eles
podem vir com lixo e você se esquecer, posteriormente, de
inicializar.
Uma boa prática é apontar os ponteiros para a primeira
posição de memória, ou seja, NULL.
Exemplo
1 int *p = NULL;
1 p1 = p2;
1 *p1 = *p2;
Ponteiros e vetores
Em C, os elementos de um vetor são sempre guardados
sequencialmente, a uma distância fixa um do outro.
Com isso, é possível facilmente passar de um elemento a outro,
percorrendo sempre uma mesma distância para frente ou para trás na
memória.
Dessa maneira, podemos usar ponteiros e a aritmética de ponteiros
para percorrer vetores. Na verdade, vetores são ponteiros - um uso
particular dos ponteiros.
1 #include <stdio.h>
2 int main (){
3 int i;
4 int vetorTeste[3] = {4, 7, 1};
5 int *ptr = vetorTeste;
6 printf("%p\n", vetorTeste);
7 printf("%p\n", ptr);
8 for (i = 0; i < 3; i++) {
9 printf("O endereco do indice %d do vetor eh %p\n", i, &ptr[i]);
10 printf("O valor do indice %d do vetor eh %d\n", i, ptr[i]);
11 }
12 return 0;
13 }
Ponteiro de estrutura
Assim como em qualquer outro tipo de dados também
podemos manipular as informações de uma estrutura
através de ponteiros.
A partir do ponteiro podemos ter acesso a um campo da
estrutura usando um seletor "− >"(uma flecha).
1 #include <stdio.h>
2 #include <string.h>
3 struct PRODUTO{
4 int codigo;
5 char descricao[100];
6 };
7 int main(){
8 struct PRODUTO produto;
9 struct PRODUTO *ptr_produto = &produto;
10 ptr_produto->codigo = 1;
11 strcpy((*ptr_produto).descricao,"Chocolate");
12 printf("Codigo do Produto: %d\n",produto.codigo);
13 printf("Descricao do Produto: %s\n",ptr_produto->descricao);
14 return 0;
15 }
1 #include <stdio.h>
2 void trocar(int num1, int num2){
3 int temp;
4 temp = num1;
5 num1 = num2;
6 num2 = temp;
7 }
8 int main(){
9 int a, b;
10 a = 5;
11 b = 10;
12 printf ("\n\nEles valem %d, %d\n", a, b);
13 trocar (a, b);
14 printf ("\n\nEles agora valem %d, %d\n", a, b);
15 return 0;
16 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Ponteiros Alocação Dinâmica de Memória Alocação de Vetores Alocação de Matrizes Alocação de Estruturas
1 #include <stdio.h>
2 void trocar(int &num1, int &num2){
3 int temp;
4 temp = num1;
5 num1 = num2;
6 num2 = temp;
7 }
8 int main(){
9 int a, b;
10 a = 5;
11 b = 10;
12 printf ("\n\nEles valem %d, %d\n", a, b);
13 trocar (a, b);
14 printf ("\n\nEles agora valem %d, %d\n", a, b);
15 return 0;
16 }
1 #include <stdio.h>
2 void trocar(int *num1, int *num2){
3 int temp;
4 temp = *num1;
5 *num1 = *num2;
6 *num2 = temp;
7 }
8 int main(){
9 int a, b;
10 a = 5;
11 b = 10;
12 printf ("\n\nEles valem %d, %d\n", a, b);
13 trocar (&a, &b);
14 printf ("\n\nEles agora valem %d, %d\n", a, b);
15 return 0;
16 }
1 #include <stdio.h>
2 void trocar(int num[]){
3 int temp;
4 temp = num[0];
5 num[0] = num[1];
6 num[1] = temp;
7 }
8 int main(){
9 int numeros[2];
10 numeros[0] = 5;
11 numeros[1] = 10;
12 printf ("Eles valem %d,%d\n",numeros[0],numeros[1]);
13 trocar (numeros);
14 printf ("Eles agora valem %d,%d\n",numeros[0],numeros[1]);
15 return 0;
16 }
1 #include <stdio.h>
2 void trocar(int *num){
3 int temp;
4 temp = num[0];
5 num[0] = num[1];
6 num[1] = temp;
7 }
8 int main(){
9 int numeros[2];
10 numeros[0] = 5;
11 numeros[1] = 10;
12 printf ("Eles valem %d,%d\n",numeros[0],numeros[1]);
13 trocar (numeros);
14 printf ("Eles agora valem %d,%d\n",numeros[0],numeros[1]);
15 return 0;
16 }
Alocação Dinâmica
Alocação Dinâmica
malloc e free
A função malloc (abreviatura de memory allocation) aloca um bloco de
bytes consecutivos na memória do computador e devolve o endereço
desse bloco. O número de bytes é especificado no argumento da
função.
A função free é responsável por liberar a memória alocada.
malloc e free
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main(){
4 // alocacao estatica
5 int a;
6 // alocacao dinamica
7 int *p = (int*)malloc(sizeof(int));
8 if ( p == NULL ){
9 printf ("Nao foi possivel alocar memoria!\n");
10 exit(1);
11 }
12 a = 10;
13 *p = 5;
14 printf("Numeros: %d - %d\n\n",a,*p);
15 free(p);
16 }
calloc
calloc
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main (){
4 int n=10;
5 int *p = (int *)calloc(n, sizeof(int));
6 if (p == NULL) {
7 printf ("** Erro: Memoria Insuficiente **");
8 exit(0);
9 }
10 for (int i=0; i<n; i++)
11 p[i] = i*i;
12
13 for (int i=0; i<n; i++)
14 printf("\n%d",p[i]);
15
16 free(p);
17 return 0;
18 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Ponteiros Alocação Dinâmica de Memória Alocação de Vetores Alocação de Matrizes Alocação de Estruturas
1 #include <stdio.h>
2 #include <stdlib.h>
3 float *Alocar_vetor_real (int n){
4 if (n < 1){
5 printf ("** Erro: Parametro invalido **\n");
6 return (NULL);
7 }
8 float * v = (float*)calloc (n, sizeof(float));
9 if (v == NULL){
10 printf ("** Erro: Memoria Insuficiente **");
11 return (NULL);
12 }
13 return (v);
14 }
15 void Liberar_vetor_real (float *v){
16 if (v != NULL)
17 free(v);
18 }
Prof. Kleber Jacques F. de Souza | klebersouza@pucminas.br Algoritmos e Estrutura de Dados II
Ponteiros Alocação Dinâmica de Memória Alocação de Vetores Alocação de Matrizes Alocação de Estruturas
1 #include <stdio.h>
2 #include <stdlib.h>
3 int **Alocar_matriz (int m, int n){
4 if (m < 1 || n < 1){
5 printf ("** Erro: Parametro invalido **\n"); return (NULL);
6 }
7 int **matriz = (int **)calloc (m, sizeof(int*));
8 if (matriz == NULL){
9 printf ("** Erro: Memoria Insuficiente **"); return (NULL);
10 }
11 for (int i = 0; i < m; i++ ){
12 matriz[i] = (int*)calloc (n, sizeof(int));
13 if (matriz[i] == NULL){
14 printf ("** Erro: Memoria Insuficiente **"); return (NULL);
15 }
16 }
17 return (matriz);
18 }
19 void Liberar_matriz (int m, int n, int **mat){
20 if (mat != NULL)
21 if (m < 1 || n < 1)
22 printf ("** Erro: Parametro invalido **\n");
23 else{
24 for (int i=0; i<m; i++)
25 free (mat[i]);
26 free (mat);
27 }
28 }
1 #include <stdio.h>
2 #include <stdlib.h>
3 typedef struct{
4 int dia, mes, ano;
5 } DATA;
6 int main(){
7 int TAM=0;
8 char aux[100];
9 do{
10 printf("\nDigite o valor de TAM: ");
11 gets(aux);
12 TAM = atoi(aux);
13 }
14 while(TAM < 0);
15 DATA *datas = (DATA*)malloc(sizeof(DATA) * TAM);
16 if (datas == NULL){
17 printf ("** Erro: Memoria Insuficiente **"); exit(0);
18 }
19 for(int i=0;i<TAM;i++){
20 datas[i].dia = rand()%28 + 1;
21 datas[i].mes = rand()%12 + 1;
22 datas[i].ano = 2000 + rand()%12;
23 }
24 for(int i=0;i<TAM;i++)
25 printf("Dia: %d/%d/%d\n",datas[i].dia,datas[i].mes,datas[i].ano);
26 free(datas);
27 return 0;
28 }
Exercícios
Exercícios
Exercícios
Dúvidas?