TransWikia.com

Decremento, incremento e soma de ponteiros em C

Stack Overflow em Português Asked by Thiago Cerqueira on January 4, 2022

Por que quando tento somar o ultimo ponteiro em mais 15 ele repete o antepenúltimo ponteiro e não soma o o ponteiro *ptr_xi com mais 15?

int xi;

int *ptr_xi;

void imprimir() 

    printf("valor de xi = %d n", xi);
    printf("valor de &xi = %p n", &xi);
    printf("valor de ptr_xi = %p n", ptr_xi);
    printf("valor de *ptr_xi = %d nn", *ptr_xi);
}

main() 
{

    xi = 10;
    ptr_xi = ξ
    imprimir();

    xi = 20;
    imprimir();

    *ptr_xi = 30;
    imprimir();

    (*ptr_xi)--;
    imprimir();

    (*ptr_xi)++;
    imprimir();

    (*ptr_xi)++;
    imprimir();

    *(ptr_xi+15);
    imprimir();

    system ("Pause");
    return(0);
}

One Answer

Em todos os anteriores você não está somando ponteiros, está somando valores apontados por variáveis ponteiros. Isto é muito diferente, faz o que provavelmente queria, mudar os valores associados. Nada disso é necessário ponteiro, pode servir para visualizar o que acontece, mas cuidado para não acharque é assim que se usa ponteiro.

No último é o único que está somando ponteiro. Manipula o ponteiro em si. Ele está indo 15 posições de memória à frente da posição original onde estava o valor que quer manipular. Como é um int provavelmente (não é certo, depende da plataforma) ele tem 4 bytes, então 15 posições são 60 bytes à frente. O que tem 60 posições à frente? Nesse caso é lixo, algo que você não tem controle, então vai acessar uma área com informação que podemos dizer quase aleatória, ou até onde não pode.

Sempre que tem um ponteiro o valor da variável é um endereço de memória, note que você usou um operador & para pegar o endereço de memória onde tinha um valor. Quando tem um ponteiro tem duas informações o endereço apontador e o valor que é apontado. Quando você manipula a variável do ponteiro está manipulando o endereço da memória. Quando quer manipular o valor, tem que pegar o endereço, fazer a indireção para o local apontado e lá é que manipula o valor, por isso usou parênteses, para pegar primeiro o local e depois fazer a operação. No último manipulou o local e depois pegou o valor nesse novo local.

Answered by Maniero on January 4, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP