Указатели Objective-C

Указатели в Objective-C легко и весело изучать. Некоторые задачи программирования на Objective-C легче выполнять с помощью указателей, а другие задачи, такие как распределение динамической памяти, не могут быть выполнены без использования указателей. Поэтому становится необходимым изучить указатели, чтобы стать идеальным программистом на Objective-C. Давайте начнем изучать их с простых и легких шагов.

Как вы знаете, каждая переменная является ячейкой памяти, и каждая ячейка памяти имеет свой адрес, доступ к которому можно получить с помощью оператора амперсанда (&), который обозначает адрес в памяти. Рассмотрим следующий пример, который напечатает адрес определенных переменных -

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

Итак, вы поняли, что такое адрес памяти и как к нему получить доступ, на этом основа концепции исчерпана. Теперь давайте посмотрим, что такое указатель.

Что такое указатели?

А pointer- это переменная, значением которой является адрес другой переменной, т. е. прямой адрес ячейки памяти. Как и любую переменную или константу, вы должны объявить указатель, прежде чем вы сможете использовать его для хранения любого адреса переменной. Общая форма объявления переменной-указателя -

type *var-name;

Вот, type- базовый тип указателя; это должен быть допустимый тип данных Objective-C иvar-nameэто имя переменной-указателя. Звездочка *, которую вы использовали для объявления указателя, - это та же звездочка, которую вы используете для умножения. Однако в этом заявлении звездочка используется для обозначения переменной как указателя. Ниже приведено действительное объявление указателя -

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

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

Как использовать указатели?

Есть несколько важных операций, которые мы будем делать с помощью указателей очень часто. (a) мы определяем переменную-указатель, (b) назначить адрес переменной указателю, и (c)наконец, получить доступ к значению по адресу, доступному в переменной-указателе. Это делается с помощью унарного оператора*который возвращает значение переменной, расположенной по адресу, указанному ее операндом. В следующем примере используются эти операции -

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* actual variable declaration */
   int  *ip;         /* pointer variable declaration */  
   ip = &var;       /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

NULL указатели в Objective-C

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

Указатель NULL - это константа с нулевым значением, определенная в нескольких стандартных библиотеках. Рассмотрим следующую программу -

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

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

Чтобы проверить нулевой указатель, вы можете использовать оператор if следующим образом:

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Указатели Objective-C в деталях

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

Sr. No. Концепция и описание
1 Objective-C - арифметика указателя

Есть четыре арифметических оператора, которые можно использовать с указателями: ++, -, +, -

2 Objective-C - массив указателей

Вы можете определить массивы для хранения нескольких указателей.

3 Objective-C - указатель на указатель

Objective-C позволяет вам иметь указатель на указатель и так далее.

4 Передача указателей на функции в Objective-C

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

5 Указатель возврата из функций в Objective-C

Objective-C позволяет функции возвращать указатель на локальную переменную, статическую переменную и динамически выделяемую память.