LA – Ling C – Aula 12A – Ponteiros

Ponteiro é uma variável que contém um endereço de memória. Esse endereço de memória é normalmente a posição de uma outra vairável na memória. Se uma variável contém o endereço de uma outra variável, então a primeira variável é dia para apontar a segunda.

Se uma variável irá conter um ponteiro, a declaração precisa conter o símbolo * e o nome da variável.

tipo *nome_variavel_ponteiro

Representaçaõ em memória, tendo uma variável apontando para outra


Endereco na      Variável na
memória          memória
                |----------|
    1000        |   1003   | ---------|
                |----------|          |
    1001        |          |          |
                |----------|          |
    1002        |          |          |
                |----------|          |  
    1003        |          | <--------|
                |----------| 
    1004        |          |
                |----------| 
    1005        |          |
                |----------| 
    1006        |          |
                |----------| 
                  Memória


 

Existem dois operadores especiais para onteiros, sendo o * (asterisco) e o & (e comercial). O & devolve o endereco na memória do seu operando. O & pode ser imaginado como retornando "o endereço de".

Atribuição de ponteiros

Do mesmo jeito que é feito em outras variáveis, é possível atribuir um ponteiro usado no lado direito de um comando de atribuição para pasar o seu valor para um outro ponteiro.


#include stdio.h

void main(void)
{
    int x;
    x = 10;
    int *p1,*p2;

    p1 = &x;
    p2 = p1;

    printf("%p", p2); /*escreve o endereco de x, e não o seu valor*/

}

Aritmética de ponteiros

Apenas 2 operações são possíveis de ser fazer utilizando ponteiros. Adição e subtração:


#include stdio.h

void main(void)
{
    int *p1;

    printf("%p", p1); /*primeiro endereco de p1*/

    printf("\n");
    p1++; /*incremento de *p1*/
    printf("%p", p1); /*proximo endereco inteiro*/

    printf("\n");
    p1++; /*incremento de *p1*/
    printf("%p", p1); /*proximo endereco inteiro*/

    printf("\n");
    p1--; /*decremento de *p1*/
    printf("%p", p1); /*proximo endereco inteiro*/

    printf("\n");
    p1--; /*decremento de *p1*/
    printf("%p", p1); /*proximo endereco inteiro*/

}

É possível somar ou subtrair valores nas variaveis ponteiro:


#include stdio.h

void main(void)
{
    int *p1;

    printf("%p", p1); /*primeiro endereco de p1*/

    p1 = p1 + 10;

    printf("\n");
    printf("%p", p1); /*proximo endereco inteiro*/

    p1 = p1 + 10;

    printf("\n");
    printf("%p", p1); /*proximo endereco inteiro*/

    p1 = p1 + 10;

    printf("\n");
    printf("%p", p1); /*proximo endereco inteiro*/

    p1 = p1 - 10;

    printf("\n");
    printf("%p", p1); /*proximo endereco inteiro*/

    p1 = p1 - 10;

    printf("\n");
    printf("%p", p1); /*proximo endereco inteiro*/

}

Não é possível fazer adição ou subtração de tipos float ou double em ponteiros, além de não poder também fazer multiplicação ou divisão em ponteiros.

Comparação entre ponteiros

É possível fazer a comparação de ponteiros em expressão relacional, verificando por exemplo de um endereço é maior que o outro:


#include stdio.h
#include locale.h //necessário para usar setlocale

void main(void)
{
    setlocale(LC_ALL, "Portuguese");

    int  *p1, *q1;

    printf("\n%p", p1);

    printf("\n%p", q1);

    if (p1 > q1)
    {
        printf("\nEndereco de p1 é maior que endereco de q1");
    }
    else
    {
        printf("\nEndereco de q1 é maior que endereco de p1");
    }
}

Temos abaixo um exemplo muito simples de pilha, utilizando ponteiros. A função push() coloca valores na piplha e a função pop() retira valores da pilha. Se caso o valor for 0 (zero), um valor será retirado da pilha. Para encerrar o programa, digite o valor -1 (menos 1)


#include stdio.h
#include stdlib.h
#include locale.h //necessário para usar setlocale

#define SIZE 50

void push(int i);
int pop(void);

int *tos, *p1, stack[SIZE];

void main(void)
{
    setlocale(LC_ALL, "Portuguese");
    int value;
    tos = stack; /*faz tos conter o topo da pilha*/
    p1 = stack;  /*inicializa p1*/

    do {
        printf("Digite o valor: ");
        scanf("%d", &value);
        if (value != 0)
            push(value);
        else
            printf("Valor do topo é: %d\n", pop());
    } while (value != -1);
}

void push(int i)
{
    p1++;
    if(p1 ==(tos+SIZE))
    {
        printf("Estouro de pilha!");
        exit(1);
    }
    *p1 = i;
}

int pop(void)
{
    if (p1 == tos)
    {
        printf("Estouro de pilha");
        exit(1);
    }
    p1--;
    return *(p1+1);
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s