Ir al contenido principal

PUNTEROS

 

Punteros 

Un puntero es un objeto del lenguaje de programación, cuyo valor se refiere a (o "apunta a") otro valor almacenado en otra parte de la memoria del ordenador utilizando su dirección. Un puntero referencia a una ubicación en memoria, y a la obtención del valor almacenado en esa ubicación se la conoce como desreferenciación  del puntero. A modo de analogía, un número de página en el índice de un libro podría considerarse un puntero a la página correspondiente; desreferenciar un puntero sería como ir a la página con el número de página especificada en el índice.

Operadores de punteros

Un puntero es una variable cuyo Rvalue es justamente la dirección en memoria de un objeto x. Es decir: Rvalue(p) == Lvalue(x). Además de los operadores aritméticos, de los que existen versiones para los tipos numéricos y para los punteros, C++ dispone de dos operadores específicos para estos últimos (punteros de cualquier tipo): la indirección * y la referencia &. Además existen dos operadores específicos para punteros-a-clases.

Operador de dirección *

Este operador unitario "deferencia" el operando (que debe ser un puntero). Es decir, devuelve el valor del objeto señalado por el operando. El símbolo * tiene tres usos en C++: operador de multiplicación, indicador de tipo de variable (tipo puntero) y operador de indirección.

Sintaxis


Operando cast-expresión debe ser una expresión que se resuelva a un puntero-a-objeto, o a-función. Cuando se usa como operador de indirección se espera que el operando sea una variable de tipo puntero de cualquier tipo (a objeto, o a función). Si el operando es un puntero-a-función, el resultado es un designador de función que puede ser utilizado para invocación de la misma. Si ptr es un puntero-a-X, entonces se cumple que *ptr es el objeto apuntado por ptr y su tipo es el de X. Es decir:



Operador de referencia &

Este operador unitario es complementario del de indirección. Cuando se aplica a un objeto devuelve la dirección de almacenamiento del objeto (valor que puede ser asignado a un puntero). En C++ el símbolo & se utiliza también como declarador de referencia; casi siempre para pasar argumentos a funciones.

Sintaxis



El operando cast-expresión debe ser alguno de los siguientes:

·        Un identificador cualificado. Ejemplo:



·        El designador de una función. Ejemplo:


·       Un Lvalue designando un objeto X que no sea un campo de bits ni tenga un especificador de almacenamiento tipo registro. Recuerde que no es posible obtener la dirección de una variable de registro. Es decir, no se le puede aplicar le operador de referencia a una de estas variables. Tampoco se puede aplicar al valor devuelto por una función, en consecuencia, la expresión x = &func(x); es incorrecta, ya que el valor devuelto por func() es del tipo registro (está en la pila que no es direccionable por este método). Regla: el operador de referencia no puede ser aplicado al valor devuelto por una función.

 

Declaraciones de punteros 

Para declarar un puntero se le debe informar a C que es lo que uno desea almacenar en memoria, por lo tanto se le informa el tipo de lo almacenado, por ejemplo:

  • char *p; (puntero a char)
  • int *p; (puntero a int)
  • float *p; (puntero a float)

La forma general de la declaración de un puntero es tipo *variable;

Ejemplo:

int x=1, y=2;

int *ip; /* ip es un puntero a int*/


ip = &x; /* ip apunta a la dirección de x */

y = *ip; /* y = 1 */

*ip = 0; /* x = 0 */

 

Operaciones con punteros

Un puntero es un tipo de dato similar a un entero, y hay un conjunto de operaciones definidas para punteros:

  • La suma o resta de un entero produce una nueva localización de memoria.
  • Se pueden comparar punteros, utilizando expresiones lógicas, para ver si están apuntando o no a la misma dirección de memoria.
  • La resta de dos punteros da como resultado el número de variables entre las dos direcciones.

Veamos un ejemplo de utilización de punteros:

#include <iostream.h>

main()
{
  int vector[3];
  int* princPunt = vector;
  int* finPunt = &vector[2];

  vector[2] = 15;
  cout << *(princPunt+2) << '\t' << *finPunt <<'\n';

  if (princPunt == finPunt)
    cout << " Esto no puede suceder " << '\n';

  cout << "Numero de elementos \t" <<finPunt-princPunt << '\n';
}

El resultado de la ejecución de este programa es:

15      15

Número de elementos     2



Comentarios

Entradas más populares de este blog

ESTRUCTURA (TYPEDEF, STRUCT)

  ESTRUCTURA (STRUCT) La palabra reservada struct indica se est ́a definiendo una estructura. El identificador ejemplo es el nombre de la estructura. Las variables declaradas dentro de las llaves de la definici ́on de estructura son los miembros de la es- tructura. Los miembros de la misma estructura deben tener nombres u ́nicos mientras que dos estructuras diferentes pueden tener miembros con el mismo nombre. Cada definici ́on de estructura debe terminar con un punto y coma. La definicion de struct ejemplo contiene un miembro de tipo char y otro de tipo int. Los miembros de una estructura pueden ser variables de los tipos de datos b ́asicos (int, char, float,etc) o agregados como ser arreglos y otras estructuras. Una estructura no puede contener una instancia de si misma.   Declaramos variables del tipo estructura del siguiente modo: struct ejemplo e1, a[10]; o alternativamente sin usar la palabra struct: ejemplo e1, a[10]; Las declaraciones anteriores declaran variables e1 d...

ARREGLOS EN C++

    Arreglos en c++ Un arreglo es un conjunto o colección finita de datos de un mismo tipo. Los elementos de un arreglo pueden ser accedidos por medio de un subíndice i.  Podemos considerar a un arreglo desde el punto de vista matemático como un vector, y a un arreglo bidimensional una matriz. Para diferenciar los elementos de un arreglo se utilizan índices detrás del nombre del arreglo y encerrados por []. Arreglos unidimensionales   Un arreglo se define como una colección finita, homogénea y ordenada de elementos como se ha definido antes pero se caracteriza por ser unidimensional porque tiene una solo dimensión como se muestra a continuación. Un arreglo tiene la característica de que puede almacenar a N elementos del mismo tipo y además permite el acceso a cada uno de estos elementos. Se distinguen dos partes en los arreglos:  • Los componentes. Hacen referencia a los elementos que componen o forman el arreglo. Es decir, son los valores que se almacenan en ca...