1. Introducción.

Para los ansiosos:

Un puntero es una variable que almacena la dirección de memoria de un objeto, usando la "dirección de memoria" puedo acceder a la variable.

Alguna duda? - Sportis Formación Deportiva. Formación de calidad para  profesionales del deporte

¿Por que necesitaría la dirección de memoria para acceder a una variable, si puedo usar el nombre de la variable?

Rta: Veremos que los punteros permiten manejar de manera muy sencilla:

  • Permite que las funciones cambien el valor de sus argumentos.
  • Permite pasar arreglos de forma eficiente entre funciones, esto por la forma de almacenamiento contiguo de los elementos de un arreglo.
  • Permite reservar memoria en tiempo de ejecución en lugar de en tiempo de compilación.
  • etc.

Conceptos.

Los punteros proporcionan la mayor parte de la potencia al C y C++, y marcan la principal diferencia con otros lenguajes de programación. Una buena comprensión y un buen dominio de los punteros pondrá en tus manos una herramienta de gran potencia.

Un conocimiento mediocre o incompleto te impedirá desarrollar programas eficaces.

Por eso le dedicaremos mucha atención y mucho espacio a los punteros. Es muy importante comprender bien cómo funcionan y cómo se usan. Para entender qué es un puntero veremos primero cómo se almacenan los datos en un ordenador.

La memoria de un ordenador está compuesta por unidades básicas llamadas bits. Cada bit sólo puede tomar dos valores, normalmente denominados alto y bajo, o 1 y 0. Pero trabajar con bits no es práctico, y por eso se agrupan, esto es histórico y se toma como base 8 bits que se conoce como byte u octeto.  

En realidad el microprocesador, y por lo tanto nuestro programa, sólo puede manejar directamente bytes o grupos de dos o cuatro bytes.

Para acceder a cada bits, primero hay que acceder a los a los bytes.

Y aquí llegamos al quid, cada byte tiene una dirección, llamada normalmente dirección de memoria.

La unidad de información básica es la palabra, dependiendo del tipo del microprocesador almacenan sus datos en bloques de dos, cuatro, ocho o dieciséis bytes. Hablaremos en estos casos de plataformas de 16, 32, 64 ó128 bits.

Se habla indistintamente de direcciones de memoria, aunque las palabras sean de distinta longitud.

Cada dirección de memoria contiene (o apunta )siempre un byte.

Lo que sucederá cuando las palabras sean de 32 bits es que accederemos a posiciones de memoria que serán múltiplos de 4. Podemos saber qué tipo de plataforma estamos usando averiguando el tamaño del tipo int, y para ello hay que usar el operador "sizeof()".

En el equipo que estoy usando por ejemplo:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) 
{ cout<<sizeof(int);
return 0;
}

Para este código la salida, en mi equipo sería 4 bytes 



Es decir que el tipo de dato entero (int) usa 4 bytes 0 32 bits. Esto nos da otro tema. Con 32 bits, puedo lograr : 2^32= 4294967296
Surge la pregunta..¿ Que pasa si quiero almacenar  un nro mayor a 4294967296?. Veamos que sucede.

#include <iostream>
using namespace std;
int main(int argc, char *argv[]) 
{   int x=5000000000;
	cout<<x;
	return 0;
}

La salida sería:
Figura 2


Claramente vemos que hay un error, lo que debería ser 5 mil millones se muestra como: 705.032.704  lo cual refleja el punto que TENEMOS QUE TENER EN CUENTA EL TIPO DE DATO QUE ALMACENAMOS Y QUE TIENE RELACIÓN CON EL VALOR DEL DATO.
Que es un anuncio - Gestion.Org
  • Un Entero, tiene un tamaño en bits distinto de un Char, de un float.
  • Un puntero tiene SIEMPRE el mismo tamaño en bits, el tamaño de una dirección.