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

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

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

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

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

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

#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

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

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.