Адрес памяти адреса памяти в машине?(Язык C) - PullRequest
1 голос
/ 10 октября 2011

Сегодня из любопытства я попробовал что-то очень странное:

Код:

int num = 2;
int * point = #

printf("%p\n" , &point);


Вопрос:

1) Первое, что я делаю, это добавляю адрес переменной num к указателю point, после чего я использую printf(), чтобы распечатать адреса хранилищ в указателе point.

2) Позже я просто пытаюсь изменить код (выше кода), чтобы посмотреть, какое поведение он даст, то есть с помощью printf() распечатать адрес указателя point вместо распечатывания адреса сохраняет в указателе point, который является адресом переменной num.

3) Тем не менее, он напечатает мне адрес, хотя адрес отличается от адреса переменной num, просто хочу знать, хорошо ли это поведение определено в стандарте C ?? Почему указатель имеет свой собственный адрес? потому что я думал, что его работа заключается в том, чтобы хранить другой адрес переменной.



Спасибо, что потратили время на чтение.

Ответы [ 3 ]

7 голосов
/ 10 октября 2011

Указатель - это просто еще одна переменная, и, следовательно, ему также нужно место для жизни.

5 голосов
/ 10 октября 2011
|----------|                             
|   point  |                            
|          |  1000                       
|   2000   |                             
|----------|                           
      |        
      |
      |
      |
      -------------------->|----------|
                           |   num    |
                           |          |  2000
                           |    2     |     
                           |----------|

Указатель point сам по себе также является переменной, и ему требуется некоторое пространство в памяти для размещения.Как показано выше, он указывает / хранит ячейку памяти, в которой num хранится (2000) в памяти, но для существования point она сама требует отдельной ячейки памяти (1000).

1 голос
/ 10 октября 2011

Все в вашем компьютере это единицы и нули.Так же, как переменная int - это просто единицы и нули в определенной ячейке памяти, указатель также является именно этим.Разница в том, как ваша программа решает угрожать содержимому этой ячейки памяти.Если вы объявите указатель, он будет использовать ячейку памяти для хранения адреса некоторых данных, но ячейка памяти, в которой они хранятся, также должна иметь адрес, как и все остальное.

Дело не столько в языке Си, сколько в том, как работает компьютер.

...