AnswerBun.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!

Related Questions

Configuração do Flutter web e Firebase

1  Asked on November 25, 2021

     

Listar o nome de todos objetos dentro do array

1  Asked on November 25, 2021 by guickz

       

Diferenças entre declarações de variáveis em C#

2  Asked on November 25, 2021 by rodolpho-chagas

     

Se C/C++ são linguagens nativas então por que precisam de runtimes?

1  Asked on November 25, 2021 by samuel-ives

   

Função Keyboard.dismiss() não funciona

1  Asked on November 25, 2021 by wander

   

Definir uma ordem especifica na query

2  Asked on November 25, 2021

 

O que significa Trying to get property non-object

0  Asked on November 25, 2021 by user198451

     

Como alterar o valor de um objeto dentro do array com Formik e Yup?

1  Asked on November 25, 2021 by bruno-elias-de-souza

     

Não estou conseguindo abrir outro Form do PyQt5

1  Asked on November 22, 2021 by nadson-alexandre

     

node js não renderiza o estilo css da página

1  Asked on November 22, 2021 by luiz-couto

     

Mapeamento de entidade oneToMany com Fluent NHibernate

1  Asked on November 20, 2021 by marllon-nasser

       

Problema ao inserir objeto com ManyToOne JPA

1  Asked on November 20, 2021 by codigoalvo

   

Abrir POST em arquivo php

1  Asked on November 19, 2021 by philip-vanstocher

   

Comparação de strings Javascript

1  Asked on November 19, 2021 by romeu-oliveira

 

Criar loop em templates com php

2  Asked on November 19, 2021 by alex-oliveira

         

Erro Angular NG Serve

2  Asked on November 19, 2021 by joo-roberto-velozo

 

Ask a Question

Get help from others!

© 2023 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir