Преобразование целочисленного указателя в целое число - PullRequest
8 голосов
/ 02 февраля 2011

Попробовал следующий код, чтобы проверить, что происходит, когда мы конвертируем целочисленный указатель в целое число.

 #include<stdio.h>
 #include<stdlib.h>
 int main()
 {
         int *p;
         int a;
         p = (int *)malloc(sizeof(int));
         *p = 10;
         a = (int)p;
         printf("%d\n",*p);
         printf("%d \n",a);
         return 0;
 }

 The output is : 10
                 135680008

Может кто-нибудь объяснить, концепция, связанная с этим преобразованием? Любые ссылки, связанные с этой темой, также будут полезны.

Ответы [ 3 ]

13 голосов
/ 02 февраля 2011

Видимо вы путаете указатель с содержимым указателя.

Как аналогия с реальным миром, вы могли бы сказать, что, когда я указываю на птицу, вы хотите превратить мой указательный палец в птицу. Но нет никакой связи между типом «птица» и «палец».

Перенос этой аналогии в вашу программу: вы конвертируете объект, указывающий на ваш int, в сам int. Поскольку указатель C реализован как «номер ячейки памяти» и поскольку доступно лотов ячеек памяти, очевидно, что (int)p приведет к очень большому числу.

Кастинг - это неприятная вещь. Это совпадение, что указатели довольно аналогичны целым числам. Если бы они были реализованы как «n th адрес банка памяти m th », вы бы не задавали этот вопрос, потому что не было бы очевидного отношения, вы бы не смогли выполнить этот акт.

4 голосов
/ 02 февраля 2011

135680008 - это десятичный адрес (это будет 0x8165008 в шестнадцатеричном формате), на который указывает p: адрес области памяти, выделенной с помощью malloc.

1 голос
/ 02 февраля 2011

Здесь вы печатаете адрес памяти a, но вы печатаете его в виде десятичного целого числа со знаком.Это не имеет большого смысла как формат, потому что некоторые старшие адреса памяти, точная граница которых зависит от размера вашего слова и компилятора, будут напечатаны как отрицательные.шестнадцатеричный, дополненный нулями до 8 или 16 символов (на самом деле, это снова зависит от точного размера слова).В printf это будет %#08X, поэтому адрес памяти 0x243 будет напечатан как 0x00000243.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...