Почему во второй строке нам не нужно писать *testString = ...
, чтобы получить доступ к месту, куда он фактически указывает?
Метод init
возвращает универсальныйуказатель на объект - его тип возвращаемого значения id
.testString
- это указатель на NSString
, который является объектом, поэтому вы назначаете указатель на другой указатель.Разыменование назначенного указателя было бы несовпадением типов.
Имя переменной - это место (метка для адреса памяти), в которое нужно что-то поместить.Тип переменной - это то, что вы можете поместить туда.В случае с указателем в него вставляется , а также адрес памяти.Чтобы получить этот адрес, вы разыменовываете указатель.То, что вы можете поместить по этому адресу, отличается от того, которое вы указали в самом указателе.
После первой строки, что такое *testString
и что такое testString
?
После первой строки *testString
или вещь, в которой testString
указывает , является мусором (фактически не определенным).testString
- указатель (4 или 8 байт в зависимости от вашей системы) на адрес в памяти, и он также не определен.
После второй строки *testString
- это объект NSString
.testString
по-прежнему является указателем на адрес, где есть действительный объект NSString
.