В споре рождается истина

- А я так не думаю!

Архив Ноябрь 14th, 2010

Указатель на константу?

оставьте комментарий »

Я уже говорил об этом в прошлом посте, а теперь более конкретно.

Допустим, есть такой код:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    const int i = 7;
    const int *cpi = &i;
    int *pi = (int*)(void*)cpi;

    printf("  &i = %x\t    i = %i\n",&i,i);
    printf(" cpi = %x\t *cpi = %i\n",cpi,*cpi);
    printf("  pi = %x\t  *pi = %i\n",pi,*pi);

    *pi = 3;
    printf("\n\n\n");

    printf("  &i = %x\t    i = %i\n",&i,i);
    printf(" cpi = %x\t *cpi = %i\n",cpi,*cpi);
    printf("  pi = %x\t  *pi = %i\n",pi,*pi);

    return 0;
}

Если этот код скомпилировать и выполнить, то вывод будет следующим:

  &i = 22ff44       i = 7
 cpi = 22ff44    *cpi = 7
  pi = 22ff44     *pi = 7



  &i = 22ff44       i = 7
 cpi = 22ff44    *cpi = 3
  pi = 22ff44     *pi = 3

Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.

Коротко о переменных:
i – просто целочисленная переменная,
cpi – указатель на целочисленную константу,
pi – указатель на целочисленную переменную.

Судя во всему, cpi (указатель на константу) на самом деле указывает не на константу. Изменение значения по адресу cpi блокируется компилятором на уровне синтаксиса, но во время выполнения значение по этому адресу все-таки можно изменить.

Почему же i и *cpi в итоге разные, если &i и cpi одинаковые – для меня загадка. Свои догадки писать здесь не буду, а то кто-то прочитает и будет думать, что это правда :)

Написано jtimv

14.11.2010 в 09:27

Опубликовано в Программирование

Follow

Get every new post delivered to your Inbox.