Правильно ли говорить, что значение указателя является адресом памяти? - PullRequest
0 голосов
/ 29 апреля 2009

Как я понимаю (или думаю, что понимаю), переменная, которая является указателем, хранит в памяти только адрес памяти.

скажем так:

int x = 5;
NSString *str1 = [NSString stringWithCString:"one"];

тогда значение x равно 5. Это то, что я вижу в Отладчике, когда ставлю точку останова.

но:

значение str1 НЕ "один". Это адрес памяти, такой как bfffd3d0. Вот что я вижу в поле «значение» отладчика, когда на этом останавливаюсь. Таким образом, за этим адресом памяти bfffd3d0 находится объект NSString с его огромной структурой данных (допустим, она огромна), множеством переменных экземпляров, значений и так далее. Это почти правильно?

Я говорю не о памяти самого имени переменной, а о значении, на которое переменная "ссылается" или на которое указывает, или хранит, или на что-либо еще.

Ответы [ 6 ]

7 голосов
/ 29 апреля 2009

Вы абсолютно правы, да.

"За этим адресом памяти bfffd3d0 находится строка NSString" лучше сказать " при этом адресе памяти bfffd3d0 ..."

2 голосов
/ 29 апреля 2009

Более или менее, и я собираюсь быть педантичным здесь. Как вы говорите, значение str1 - это место, где хранится «один», а не «один».

Однако, это не совсем адрес памяти, по нескольким причинам. Во-первых, аппаратная причина того, что ваше приложение работает с виртуальной памятью, и поэтому оно даже не видит фактические адреса памяти. Значение (скажем, 0xbfffd3d0) - это просто адрес виртуальной памяти, в который был сопоставлен фактический адрес памяти. Это может даже не соответствовать адресу памяти вообще. Он может быть не отображен (поэтому доступ к этому адресу вызовет ошибку сегментации / нарушение доступа, или он может быть отображен в память и поддержан файлом или аппаратным устройством. Возможно, что запись по этому «адресу» на самом деле не записывать данные в память, но вместо этого отправляет сигнал в графический процессор.

И, во-вторых, причина языка-юриста: указатели не адреса. Есть операции, которые будут действительны для адресов, но не определены для указателей. Указатель NULL может указывать на другие адреса, отличные от 0. Указатели, которые не указывают на один и тот же массив, могут не сравниваться на равенство, даже если было бы разумно сделать это для адресов памяти.

Эта ссылка более подробно описывает ситуацию (особенно для C ++, но в основном то же самое для C и obj-C.)

Но краткий ответ заключается в том, что указатели разработаны так, чтобы они могли быть реализованы bby компилятором как (виртуальные) адреса памяти. Поэтому на практике они, как правило, ведут себя примерно одинаково, но имеют различия, и при условии, что указатель равен * , адрес памяти в какой-то момент приведет к ошибкам.

И в случае, если вы об этом спрашиваете, вы совершенно правы, переменная-указатель хранит место, в котором можно найти данные, а не сами данные.

1 голос
/ 29 апреля 2009

Насколько я понимаю, указатель указывает на адрес памяти, значение, содержащееся в этом адресе, можно получить, разыменовав указатель

int number = 14;
int* ptrNumber = &number; //the value of the pointer is now the address of number

int n=*ptrNumber; //pointer was dereferenced, so n is now the value at the address of ptrNumber (n = 14)
1 голос
/ 29 апреля 2009

Если под адресом памяти вы подразумеваете RAM, то это не совсем правильно. Указатель может содержать адрес подключенного устройства (например, видеокарту, сетевую карту и т. Д.).

1 голос
/ 29 апреля 2009

Вы пометили это как target-c, но «указатели» не относятся только к target-c. Другие языки, такие как C ++, также имеют указатели.

1 голос
/ 29 апреля 2009

Да, это достаточно подробное описание.

Относительно вашего другого вопроса , фактически этот вызов NSLog передает адрес переменной в стек, но @"%x" говорит NSLog интерпретировать этот адрес как целое число.

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