Puntero frente a matriz
Un puntero es un tipo de datos que contiene una referencia a una ubicación de memoria (es decir, una variable de puntero almacena una dirección de una ubicación de memoria en la que se almacenan algunos datos). Las matrices son la estructura de datos más utilizada para almacenar una colección de elementos. La mayoría de los lenguajes de programación proporcionan métodos para declarar matrices y acceder fácilmente a los elementos de las matrices.
¿Qué es un puntero?
Un puntero es un tipo de datos que almacena una dirección de una ubicación de memoria en la que se almacenan algunos datos. En otras palabras, un puntero contiene una referencia a una ubicación de memoria. El acceso a los datos almacenados en la ubicación de la memoria a la que hace referencia el puntero se denomina desreferenciación. Al realizar operaciones repetitivas como atravesar árboles/cadenas, búsquedas en tablas, etc., el uso de punteros mejoraría el rendimiento. Esto se debe a que desreferenciar y copiar punteros es más económico que copiar y acceder a los datos señalados por los punteros. Un puntero nulo es un puntero que no apunta a nada. En Java, acceder a un puntero nulo generaría una excepción llamada NullPointerException.
¿Qué es una matriz?
En la figura 1 se muestra un fragmento de código que normalmente se usa para declarar y asignar valores a una matriz. La figura 2 muestra cómo se vería una matriz en la memoria.
valores int[5]; valores[0]=100; valores[1]=101; valores[2]=102; valores[3]=103; valores[4]=104; |
Figura 1: Código para declarar y asignar valores a una matriz
100 | 101 | 102 | 103 | 104 |
Índice: 0 | 1 | 2 | 3 | 4 |
Figura 2: Array almacenado en la memoria
El código anterior define una matriz que puede almacenar 5 enteros y se accede a ellos usando los índices 0 a 4. Una propiedad importante de una matriz es que toda la matriz se asigna como un solo bloque de memoria y cada elemento obtiene su propio espacio en la matriz. Una vez que se define una matriz, su tamaño es fijo. Entonces, si no está seguro del tamaño de la matriz en el momento de la compilación, deberá definir una matriz lo suficientemente grande para estar seguro. Pero, la mayoría de las veces, en realidad vamos a utilizar menos elementos de los que hemos asignado. Por lo tanto, se desperdicia una cantidad considerable de memoria. Por otro lado, si la "matriz lo suficientemente grande" no es lo suficientemente grande, el programa fallará.
¿Cuál es la diferencia entre punteros y matrices?
Un puntero es un tipo de datos que almacena una dirección de una ubicación de memoria en la que se almacenan algunos datos, mientras que las matrices son la estructura de datos más utilizada para almacenar una colección de elementos. En el lenguaje de programación C, la indexación de matrices se realiza mediante aritmética de punteros (es decir, el i-ésimo elemento de la matriz x sería equivalente a (x+i)). Por lo tanto, en C, el conjunto de punteros que apuntan a un conjunto de ubicaciones de memoria que son consecutivas puede considerarse como una matriz. Además, hay una diferencia en cómo opera el operador sizeof en punteros y matrices. Cuando se aplica a una matriz, el operador sizeof devolverá el tamaño completo de la matriz, mientras que cuando se aplica a un puntero, devolverá solo el tamaño del puntero.