Более или менее, и я собираюсь быть педантичным здесь. Как вы говорите, значение str1
- это место, где хранится «один», а не «один».
Однако, это не совсем адрес памяти, по нескольким причинам. Во-первых, аппаратная причина того, что ваше приложение работает с виртуальной памятью, и поэтому оно даже не видит фактические адреса памяти. Значение (скажем, 0xbfffd3d0
) - это просто адрес виртуальной памяти, в который был сопоставлен фактический адрес памяти. Это может даже не соответствовать адресу памяти вообще. Он может быть не отображен (поэтому доступ к этому адресу вызовет ошибку сегментации / нарушение доступа, или он может быть отображен в память и поддержан файлом или аппаратным устройством. Возможно, что запись по этому «адресу» на самом деле не записывать данные в память, но вместо этого отправляет сигнал в графический процессор.
И, во-вторых, причина языка-юриста: указатели не адреса.
Есть операции, которые будут действительны для адресов, но не определены для указателей. Указатель NULL может указывать на другие адреса, отличные от 0. Указатели, которые не указывают на один и тот же массив, могут не сравниваться на равенство, даже если было бы разумно сделать это для адресов памяти.
Эта ссылка более подробно описывает ситуацию (особенно для C ++, но в основном то же самое для C и obj-C.)
Но краткий ответ заключается в том, что указатели разработаны так, чтобы они могли быть реализованы bby компилятором как (виртуальные) адреса памяти. Поэтому на практике они, как правило, ведут себя примерно одинаково, но имеют различия, и при условии, что указатель равен * , адрес памяти в какой-то момент приведет к ошибкам.
И в случае, если вы об этом спрашиваете, вы совершенно правы, переменная-указатель хранит место, в котором можно найти данные, а не сами данные.