Ponteiros Objective-C

Os ponteiros em Objective-C são fáceis e divertidos de aprender. Algumas tarefas de programação Objective-C são realizadas mais facilmente com ponteiros, e outras tarefas, como alocação de memória dinâmica, não podem ser executadas sem o uso de ponteiros. Portanto, torna-se necessário aprender ponteiros para se tornar um programador Objective-C perfeito. Vamos começar a aprendê-los em etapas simples e fáceis.

Como você sabe, cada variável é um local da memória e cada local da memória tem seu endereço definido, que pode ser acessado usando o operador E comercial (&), que denota um endereço na memória. Considere o seguinte exemplo, que imprimirá o endereço das variáveis ​​definidas -

#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;
}

Quando o código acima é compilado e executado, ele produz o resultado algo como a seguir -

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

Então, você entendeu o que é endereço de memória e como acessá-lo, então a base do conceito acabou. Agora vamos ver o que é um ponteiro.

O que são ponteiros?

UMA pointeré uma variável cujo valor é o endereço de outra variável, ou seja, o endereço direto do local da memória. Como qualquer variável ou constante, você deve declarar um ponteiro antes de usá-lo para armazenar qualquer endereço de variável. A forma geral de uma declaração de variável de ponteiro é -

type *var-name;

Aqui, typeé o tipo base do ponteiro; deve ser um tipo de dados Objective-C válido evar-nameé o nome da variável de ponteiro. O asterisco * que você usou para declarar um ponteiro é o mesmo asterisco que você usa para a multiplicação. No entanto, nesta declaração, o asterisco está sendo usado para designar uma variável como um ponteiro. A seguir estão as declarações de ponteiro válidas -

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

O tipo de dados real do valor de todos os ponteiros, seja inteiro, flutuante, caractere ou outro, é o mesmo, um número hexadecimal longo que representa um endereço de memória. A única diferença entre ponteiros de diferentes tipos de dados é o tipo de dados da variável ou constante para a qual o ponteiro aponta.

Como usar ponteiros?

Existem algumas operações importantes, que faremos com a ajuda de ponteiros com muita freqüência. (a) definimos uma variável de ponteiro, (b) atribuir o endereço de uma variável a um ponteiro, e (c)finalmente acesse o valor no endereço disponível na variável de ponteiro. Isso é feito usando o operador unário*que retorna o valor da variável localizada no endereço especificado por seu operando. O exemplo a seguir faz uso dessas operações -

#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;
}

Quando o código acima é compilado e executado, ele produz o resultado algo como a seguir -

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

Ponteiros NULL em Objective-C

É sempre uma boa prática atribuir um valor NULL a uma variável de ponteiro, caso você não tenha um endereço exato a ser atribuído. Isso é feito no momento da declaração da variável. Um ponteiro que é atribuído NULL é chamado denull ponteiro.

O ponteiro NULL é uma constante com valor zero definido em várias bibliotecas padrão. Considere o seguinte programa -

#import <Foundation/Foundation.h>

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

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

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

Na maioria dos sistemas operacionais, os programas não têm permissão para acessar a memória no endereço 0 porque essa memória é reservada pelo sistema operacional. No entanto, o endereço de memória 0 tem um significado especial; ele sinaliza que o ponteiro não se destina a apontar para um local de memória acessível. Mas, por convenção, se um ponteiro contém o valor nulo (zero), presume-se que ele não aponte para nada.

Para verificar se há um ponteiro nulo, você pode usar uma instrução if da seguinte maneira -

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

Ponteiros Objective-C em detalhes

Ponteiros têm muitos conceitos fáceis e são muito importantes para a programação Objective-C. Seguem alguns conceitos importantes de ponteiro, que devem ser claros para um programador Objective-C -

Sr. Não. Conceito e descrição
1 Objective-C - Aritmética de ponteiro

Existem quatro operadores aritméticos que podem ser usados ​​em ponteiros: ++, -, +, -

2 Objective-C - Matriz de ponteiros

Você pode definir matrizes para conter uma série de ponteiros.

3 Objective-C - Ponteiro a ponteiro

Objective-C permite que você tenha um ponteiro sobre um ponteiro e assim por diante.

4 Passando ponteiros para funções em Objective-C

Passar um argumento por referência ou por endereço permite que o argumento passado seja alterado na função de chamada pela função chamada.

5 Ponteiro de retorno de funções em Objective-C

Objective-C permite que uma função retorne um ponteiro para uma variável local, variável estática e memória alocada dinamicamente.