Exemplos com Ponteiros

Exemplo 1:


#include <stdio.h>
int main()
{
int a=2, b=3;
int *p, *q;
p = &a;
q = &b;
printf("Endereco da variavel a em decimal = %lu\n", p);
printf("Endereco da variavel a em hexadecimal = %p\n", p);
printf("Endereco da variavel b em decimal = %lu\n", q);
printf("Endereco da variavel b em hexadecimal = %p\n", q);
printf("Qual o conteudo do endereco %p? Resposta: %d\n", p, *p);
printf("Qual o conteudo do endereco %p? Resposta: %d\n", q, *q);
return 0;
}


Exemplo 2:


#include <stdio.h>
//Isto ilustra a passagem de parâmetros POR VALOR,
//onde ocorre a cópia dos valores das variáveis.
//É sempre assim para tipos primitivos.
void troca(int x, int y) //isto não funciona!!!! A troca nesse caso só ocorre na função
{ int aux;
printf("troca: ANTES:  x = %d, y = %d\n", x, y);
aux = x;
x = y;
y = aux;
printf("troca: DEPOIS:  x = %d, y = %d\n", x, y);
}
int main()
{ int a=2, b=3;
printf("main: ANTES: a = %d, b = %d\n", a, b);
troca(a, b);
printf("main: DEPOIS: a = %d, b = %d\n", a, b);
return 0;
}

Exemplo 3:


#include <stdio.h>
//Isto ilustra a passagem de parâmetros POR REFERÊNCIA,
//onde ocorre a cópia dos endereços das variáveis.
void troca(int *p, int *q) //isto funciona!!!!
{ int aux;
aux = *p;  // *p refere-se ao valor de a dentro do main
*p = *q;  // *q refere-se ao valor de b dentro do main
*q = aux;
}
int main()
{ int a=2, b=3;
printf("ANTES: a = %d, b = %d\n", a, b);
troca(&a, &b);
printf("DEPOIS: a = %d, b = %d\n", a, b);
return 0;
}

Exemplo 4:


/*
No exemplo abaixo, tentamos escrever numa área de memória
que não é destinada ao usuário. Portanto, o Sistema Operacional
bloqueia o acesso e derruba o programa.
*/
#include<stdio.h>
int main()
{
int *p;
p = 1;
*p = 4;
return 0;
}

Exemplo 5:


#include<stdio.h>
int main()
{ int vet[5] = {7, 2, 4, 9, 6};
printf("Imprimindo o endereco de vet[0] = %lu\n", &vet[0]);
printf("Imprimindo o endereco de vet[1] = %lu\n", &vet[1]);
printf("Imprimindo o endereco de vet[2] = %lu\n", &vet[2]);
printf("Imprimindo o endereco de vet[3] = %lu\n", &vet[3]);
printf("Imprimindo o endereco de vet[4] = %lu\n", &vet[4]);
printf("Imprimindo o simplesmente o valor da variavel vet = %lu\n", vet);
double vet2[5] = {7, 2, 4, 9, 6};
printf("Imprimindo o endereco de vet2[0] = %lu\n", &vet2[0]);
printf("Imprimindo o endereco de vet2[1] = %lu\n", &vet2[1]);
printf("Imprimindo o endereco de vet2[2] = %lu\n", &vet2[2]);
printf("Imprimindo o endereco de vet2[3] = %lu\n", &vet2[3]);
printf("Imprimindo o endereco de vet2[4] = %lu\n", &vet2[4]);
printf("Imprimindo o simplesmente o valor da variavel vet2 = %lu\n", vet2);
char vet3[5] = {'a', 'b', 'c', 'd', 'e'};
printf("Imprimindo o endereco de vet3[0] = %lu\n", &vet3[0]);
printf("Imprimindo o endereco de vet3[1] = %lu\n", &vet3[1]);
printf("Imprimindo o endereco de vet3[2] = %lu\n", &vet3[2]);
printf("Imprimindo o endereco de vet3[3] = %lu\n", &vet3[3]);
printf("Imprimindo o endereco de vet3[4] = %lu\n", &vet3[4]);
printf("Imprimindo o simplesmente o valor da variavel vet3 = %lu\n", vet3);
/* Reparem que o nome do vetor já corresponde a um ponteiro que aponta para o primeiro elemento do vetor!!
*/
return 0;
}

Exemplo 6:


#include<stdio.h>
int main()
{ int vet[5] = {7, 2, 4, 9, 6};
int *p = vet; // p recebe o endereco de memoria do vetor vet
int i;
for(i=0; i<5; i++)
{ printf("Endereco = %lu, Valor = %d\n", p, *p);
p++; // quantos bytes foram pulados aqui???
}
double vet2[5] = { 7,2, 4, 9, 6};
double *q = vet2;
for(i=0; i<5; i++)
{ printf("Endereco = %lu, Valor = %f\n", q, *q);
q++; // quantos bytes foram pulados aqui???
}
char vet3[5] = {'a', 'b', 'c', 'd', 'e'};
char *r = vet3;
for(i=0; i<5; i++)
{ printf("Endereco = %lu, Valor = %c\n", r, *r);
r++; // quantos bytes foram pulados aqui???
}
return 0;
}

Exemplo 7:


#include<stdio.h>
int main()
{ int vet[5] = {7, 2, 4, 9, 6};
int *p = vet;
int i;
for(i=0; i<5; i++)
{ printf("Endereco = %u, Valor = %d\n", p+i, *(p+i)); // p+i equivale a p++
}
double vet2[5] = {7, 2, 4, 9, 6};
double *q = vet2;
for(i=0; i<5; i++)
{ printf("Endereco = %u, Valor = %f\n", q+i, *(q+i));
}
char vet3[5] = {'a', 'b', 'c', 'd', 'e'};
char *r = vet3;
for(i=0; i<5; i++)
{ printf("Endereco = %u, Valor = %c\n", r+i, *(r+i));
}
return 0;
}


Exemplo 8:


#include<stdio.h>
#include<stdlib.h>
int main()
{ int  *p;
p = (int *) malloc(10 * sizeof(int));
//o acima é mais ou menos equivalente a   int p[10];
//só que é uma alocação dinâmica através de uma
//chamada do sistema operacional (malloc)
int i; 
for(i=0; i<10;i++)
{ p[i] = 2*i;
printf("%d - ", p[i]);
}
return 0;
}


Exemplo 9:


//Exemplo que NÃO funciona como gostaríamos
#include<stdio.h>
int * funcao()
{ int vet[]={1,2,3,4,5};
return vet;
}
int main()
{ int *p;
p = funcao();
//Não funciona como imaginaríamos....
printf("%d - %d - %d - %d - %d\n", p[0], p[1], p[2], p[3], p[4]);
return 0;
}


Exemplo 10:


  #include<stdio.h>
  #include<stdlib.h>
  #include<string.h>
   int * funcao(){
       int * vet = malloc(5*sizeof(int));
       memcpy(vet, (int [ ]){1,2,3,4,5}, 5*sizeof(int));
       return vet;
   }

int main(){
    int *p;
    p = funcao();
    //Agora vai!!!
    printf("%d - %d - %d - %d - %d\n", p[0], p[1], p[2], p[3], p[4]);
    return 0;
}


Exemplo 11:


#include<stdio.h>
#include<stdlib.h>
int main()
{ int * p, * q;
p = (int *) malloc(10 * sizeof(int)); //int p[10] (o tamanho da variável em bytes pode variar, por isso não é indicado. Além disso, essa declaração torna fixo o tamanho do vetor.);
q = (int *) malloc(10 * sizeof(int));
int i;
for(i=0; i<10;i++)
{ p[i] = 2*i;
printf("%d - ", p[i]);
}
printf("\nO vetor acima (p) esta no endereco %lu\n\n", p);
printf("\nO outro vetor (q) esta no endereco %lu\n\n", q);
//agora vamos aumentar o vetor p com realloc
p = (int *) realloc(p, 100 * sizeof(int)); //realoca o vetor para o tamanho 100 ~ int p[100];
for(i=10; i<100;i++)
{ p[i] = 2*i;
}
printf("\nAumentando o vetor para 100 elementos:\n");
for(i=0; i<100;i++)
{ printf("%d - ", p[i]);
}
printf("\nO novo vetor esta no endereco %u\n\n", p);
return 0;
}


Exemplo 12:


#include <stdlib.h>
struct cliente {
    char nome[50];
    char cnpj[20];
};                                                                               
typedef struct cliente CLIENTE;
int main()
{   int N = 1, fichas = 0, i;
    CLIENTE *cadastro = (CLIENTE *) malloc(N*sizeof(CLIENTE)); //semelhante a CLIENTE cadastro[N];
    for(i=0; i<10; i++)
    {   if(fichas>=N) //estourei o vetor
        {   N = N*2;
            cadastro = (CLIENTE *) realloc(cadastro, N * sizeof(CLIENTE));
            printf("Armazenamento redimensionado para %d fichas\n", N);
        }
        
        printf("Entre com o nome: ");
        fgets(cadastro[fichas].nome, 50, stdin);
        printf("Entre com o CNPJ: ");
        fgets(cadastro[fichas].cnpj, 20, stdin);
        fichas++;
    }
    
    for(i=0; i<10; i++)
    {   printf("%d) Nome: %s", i+1, cadastro[i].nome);
        printf("   CNPJ: %s", cadastro[i].cnpj);
    }
    return 0;
}

Exemplo 13:


#include<stdio.h>
#include<stdlib.h>
struct amigo
{ int idade;
char nome[50];
};
typedef struct amigo AMIGO;
int main()
{ AMIGO * p;
p = (AMIGO *) malloc(5 * sizeof(AMIGO));
//Isso é similar a: AMIGO p[5];

char aux[50];
int i;
for(i=0; i<5;i++)
{ printf("\nEntre com a idade:");
fgets(aux, 50, stdin);
p[i].idade = atoi(aux);
printf("\nEntre com o nome:");
fgets(p[i].nome, 50, stdin);
}
//ilustrando o uso do operador ->
AMIGO * a;
a = p;
for(i=0; i<5;i++)
{ printf("\nIdade: %d", a->idade);   //equivalente a:  printf("\nIdade: %d", p[i].idade);
printf("\nNome: %s", a->nome);  //equivalente a:  printf("\nNome: %s", p[i].nome);
//reparem no uso do operador ->
a++;
}
return 0;
}


Comentários

Postagens mais visitadas deste blog