Понимание указателей? - PullRequest
       0

Понимание указателей?

1 голос
/ 17 марта 2012

Как видно из названия, у меня возникают проблемы с пониманием того, что такое указатель и почему он используется. Я искал немного, но до сих пор не понимаю. Я работаю в основном в Objective-C, но из того, что я прочитал, это действительно больше тема C (поэтому я добавил оба тега).

Насколько я понимаю, переменная со звездочками впереди указывает на адрес в памяти? Я не совсем понимаю, почему вы используете указатель на значение, а не просто используете само значение.

Например:

NSString *stringVar = @"This is a test.";

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

Несколько не по теме, но правильно ли я это отметил? Когда я писал его, я думал, что это скорее концепция программирования, а не что-то специфическое для конкретного языка, но он сфокусирован именно на Objective-C, поэтому я пометил его как target-c и c.

Ответы [ 6 ]

6 голосов
/ 17 марта 2012

Я не совсем понимаю, почему вы используете указатель на значение вместо простого использования самого значения.

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

  • Вы можете сказать мне что значение: «5»: «Пожалуйста, удвойте 5 для меня».Это называется передачей по значению .Я могу сказать вам, что ответ 10, но если вы где-то записали 5, то 5 все равно будет.Любой другой, кто ссылается на эту статью, все равно увидит 5.

  • Вы можете сказать мне , где значение: «Пожалуйста, сотрите записанное мной числоздесь и напишите дважды это число на своем месте. "Это называется передачей по ссылке .Когда я закончу, оригинальная 5 исчезнет и на ее месте будет 10.Любой, кто ссылается на эту статью, теперь увидит 10.

Указатели используются для относятся к некоторому фрагменту памяти, а не копируют некоторыечасть памяти.Когда вы передаете по ссылке, вы передаете указатель в память, о которой говорите.

При вызове методов для этой строки, почему это указатель, а не просто использование строки непосредственно?

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

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

Иногда мы do используем указатели на целые числа и другие базовые типы данных.В целом, однако, мы передаем эти типы по значению, потому что это быстрее.Если я хочу передать вам небольшой фрагмент данных, мне будет проще дать вам данные напрямую, чем сообщить, где вы можете найти информацию.Однако, если данные большие, верно и обратное: мне гораздо быстрее сказать, что в гостиной есть словарь, чем прочесть его содержимое.

3 голосов
/ 17 марта 2012

Я думаю, что вы, возможно, немного запутались между объявлением переменной-указателя и использованием указателя.

Любой тип данных со звездочкой после него является адресом значения данныхtype.

Итак, в C вы можете написать:char c;и это означает, что значение c является одним символом.Ноchar *p;является адресом символа.

'*' после имени типа означает, что значением переменной является адрес объекта этого типа.

Давайте поместим значение в c:c = 'H';

Итакchar *p;означает, что значение p является адресом символа.p не содержит символа, он содержит адрес символа.

Оператор C & возвращает адрес значения, поэтомуp = &c;означает положить адрес переменной с в р.Мы говорим «р указывает на с».

Теперь вот немного странная часть.Адрес первого символа в строке также является адресом начала строки.

Так что дляchar *p = "Hello World. I hope you are all who safe, sound, and healthy";p содержит адрес 'H', и неявно, потому что символы являются смежными, p содержит адрес начала строки.

Чтобы получить символ в начале строки, 'H ', используйте оператор' get at the item, который указывает на ', то есть' * '.

Так что *p это' H '

p = &c; if (*p == c) { ... is true ... }

Когда вызывается функция или метод, чтобы использовать строку символов, только начальный адрес строки (обычно 4 или 8 байтов) должен быть передан функции, а не вся строка.Это и эффективно, и также означает, что функция может воздействовать на строку и изменять ее, что может быть полезно.Это также означает, что строка может быть общей.

1 голос
/ 17 марта 2012

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

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

Указатель - это специальная переменная, которая хранит ячейку памяти другая переменная.

Так что указатель - это не что иное, как переменная ... это специальная переменная. Почему это особенное, потому что ... прочитайте пункт 2

Указатель - это специальная переменная, которая хранит ячейку памяти другая переменная.

Содержит ячейку памяти другой переменной. Под ячейкой памяти я подразумеваю, что она не содержит значения другой переменной, но в ней хранится номер адреса памяти (так сказать) другой переменной. Что это за другая переменная, прочитайте пункт 3.

Указатель - это специальная переменная, которая хранит ячейку памяти другая переменная.

Другой переменной может быть что угодно ... это может быть float, int, char, double и т. Д. Если переменная, то ее место в памяти, на котором она создается, может быть присвоено переменной-указателю.

0 голосов
/ 17 марта 2012
NSString *stringVar = @"This is a test.";
При вызове методов для этой строки, почему это указатель, а не просто использование строки?

Это довольно экзистенциальный вопрос. Я бы сказал так: что это строка, если не ее местоположение? Как бы вы внедрили систему, если не можете как-то ссылаться на объекты? По имени, конечно ... Но как это имя? Как машина это понимает?

ЦПУ имеет инструкции, которые работают с операндами. Msgstr "Добавить х к у и сохранить результат здесь." Эти операнды могут быть регистрами (скажем, для 32-разрядного целого числа, например, что i в пресловутом цикле for может быть сохранено), но их число ограничено. Возможно, мне не нужно убеждать вас, что нужна какая-то форма памяти. Я бы тогда поспорил, как вы скажете процессору, где найти эти вещи в памяти, если не для указателей?

Вы: «Добавьте x к y и сохраните его в памяти».
Процессор: ОК. Где?
Вы: Ну, я не знаю, как, где когда-либо ...

На самых низких уровнях это не работает как эта последняя строка. Вы должны быть немного более конкретны, чтобы процессор работал. : -)

Так что на самом деле все, что делает указатель, это говорит "строка в X", где X - целое число. Потому что для того, чтобы что-то сделать, нужно знать, где ты работаешь. Точно так же, когда у вас есть массив целых чисел a, и вам нужно взять a[i], i имеет какое-то значение для вас. Как это имеет значение? Ну, это зависит от вашей программы. Но вы не можете утверждать, что это i не должно существовать.

В действительности на этих других языках вы также работаете с указателями. Вы просто не знаете об этом. Некоторые люди скажут, что они так предпочитают. Но в конечном итоге, когда вы пройдете все уровни абстракции, вам нужно будет указать процессору, на какую часть памяти смотреть. :-) Поэтому я бы сказал, что указатели необходимы независимо от того, какие абстракции вы в конечном итоге создаете.

0 голосов
/ 17 марта 2012

Чтобы ответить на каждый из ваших вопросов:

(1) Насколько я понимаю, переменная со звездочками впереди указывает на адрес в памяти?

Вы можете видеть это таким образом более или менее.Звездочкой является оператор разыменования , который берет указатель и возвращает значение по адресу, содержащемуся в указателе.

(2) Я не совсем понимаю, почему вы 'Использовать указатель на значение вместо того, чтобы просто использовать само значение.

Поскольку указатели позволяют различным разделам кода обмениваться информацией, лучше, чем копировать значение здесь и там, а также разрешают указывать переменные илиобъекты, которые будут изменены вызываемой функцией.Кроме того, указатели включали сложные связанные структуры данных.Прочитайте этот короткий урок Указатели и память .

(3) Почему бы вам не использовать указатели на целые числа и другие базовые типы данных?

Строка является указателем , в отличие от int или char.Строка - это указатель, который указывает на начальный адрес данных, который содержит строку, и возвращает все значения от начального адреса данных до конечного байта.

строка является более сложным типом данных, чем char илиInt, например.На самом деле, не думайте, что sting как type как тип char. string - указатель, который указывает на кусок памяти .Из-за его сложности наличие класса вроде NSString для предоставления полезных функций для работы с ними становится очень значимым.См. NSString .

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

0 голосов
/ 17 марта 2012

Я слышал аналогию о том, что объект похож на баллон, а строка, с которой вы держите его, является указателем.Как правило, код выполняется следующим образом:

MyClass *someObj = [[MyClass alloc] init];

Вызов alloc выделит память для объекта, а init создаст его экземпляр с определенным набором свойств по умолчанию в зависимости от класса.Вы можете переопределить init.

Указатели позволяют передавать ссылки на один объект в памяти на несколько объектов.Если бы мы работали со значениями без указателей, вы бы не смогли ссылаться на один и тот же объект в памяти в двух разных местах.

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