En informática , un array es un tipo de dato que representa una colección de elementos ( valores o variables ), cada uno seleccionado por uno o más índices (claves de identificación) que se pueden calcular en tiempo de ejecución durante la ejecución del programa. Dicha colección se suele denominar variable de array o valor de array . [ 1 ] Por analogía con los conceptos matemáticos vector y matriz , los arrays con uno y dos índices se denominan a menudo tipo vector y tipo matriz , respectivamente. De forma más general, un array multidimensional (o array n -dimensional ) se puede denominar tipo tensor , por analogía con el concepto matemático tensor . [ 2 ]
El soporte del lenguaje para los tipos de matriz puede incluir ciertos tipos de datos de matriz integrados , algunas construcciones sintácticas ( constructores de tipos de matriz ) que el programador puede usar para definir dichos tipos y declarar variables de matriz, y notación especial para indexar elementos de matriz. [ 1 ] Por ejemplo, en el lenguaje de programación Pascal , la declaración define un nuevo tipo de datos de matriz llamado . La declaración luego define una variable de ese tipo, que es un agregado de ocho elementos, cada uno de los cuales es una variable entera identificada por dos índices. En el programa Pascal, esos elementos se denotan , , , …, . [ 3 ] Los tipos de matriz especiales a menudo se definen en las bibliotecas estándar del lenguaje .typeMyTable=array[1..4,1..2]ofintegerMyTablevar A: MyTableAA[1,1]A[1,2]A[2,1]A[4,2]
Las listas dinámicas también son más comunes y fáciles de implementar que los arreglos dinámicos . Los tipos de arreglo se distinguen de los tipos de registro principalmente porque permiten calcular los índices de los elementos en tiempo de ejecución , como en la asignación de Pascal . Entre otras cosas, esta característica permite que una sola instrucción iterativa procese un número arbitrario de elementos de una variable de arreglo.A[I,J] := A[N-I,2*J]
En contextos más teóricos, especialmente en la teoría de tipos y en la descripción de algoritmos abstractos , los términos "array" y "tipo de array" a veces se refieren a un tipo de datos abstracto (TDA), también llamado array abstracto , o pueden referirse a un array asociativo , un modelo matemático con las operaciones básicas y el comportamiento de un tipo de array típico en la mayoría de los lenguajes ; básicamente, una colección de elementos que se seleccionan mediante índices calculados en tiempo de ejecución.
Dependiendo del lenguaje, los tipos de arreglos pueden superponerse (o identificarse con) otros tipos de datos que describen agregados de valores, como listas y cadenas . Los tipos de arreglos suelen implementarse mediante estructuras de datos de arreglos , pero a veces mediante otros métodos, como tablas hash , listas enlazadas o árboles de búsqueda .
Historia
El lenguaje de programación Superplan (1949-1951), creado por Heinz Rutishauser , incluía matrices multidimensionales. Sin embargo, aunque Rutishauser describió cómo debía construirse un compilador para su lenguaje, no llegó a implementarlo.
Los lenguajes ensamblador y los lenguajes de bajo nivel como BCPL [ 4 ] generalmente no tienen soporte sintáctico para matrices.
Debido a la importancia de las estructuras de matrices para una computación eficiente, los primeros lenguajes de programación de alto nivel, incluidos FORTRAN (1957), COBOL (1960) y Algol 60 (1960), ofrecían soporte para matrices multidimensionales.
Matrices abstractas
Una estructura de datos de matriz se puede modelar matemáticamente como una estructura de datos abstracta (una matriz abstracta ) con dos operaciones.
- obtener ( A , I ) : los datos almacenados en el elemento del array A cuyos índices son la tupla entera I .
- conjunto ( A , I , V ) : el array que resulta al establecer el valor de ese elemento a V .
Estas operaciones son necesarias para satisfacer los axiomas [ 5 ].
- obtener ( establecer ( A , I , V ), I ) = V
- obtener ( establecer ( A , I , V ), J ) = obtener ( A , J ) si I ≠ J
para cualquier estado de matriz A , cualquier valor V y cualquier tupla I , J para las cuales se definen las operaciones.
El primer axioma implica que cada elemento se comporta como una variable. El segundo axioma implica que los elementos con índices distintos se comportan como variables disjuntas , de modo que almacenar un valor en un elemento no afecta el valor de ningún otro elemento.
Estos axiomas no imponen ninguna restricción al conjunto de tuplas de índices válidas I , por lo tanto, este modelo abstracto puede utilizarse para matrices triangulares y otros arreglos de formas irregulares.
Implementaciones
Para implementar eficazmente variables de este tipo como estructuras de matriz (con indexación mediante aritmética de punteros ), muchos lenguajes restringen los índices a tipos de datos enteros [ 6 ] [ 7 ] (u otros tipos que se pueden interpretar como enteros, como bytes y tipos enumerados ), y requieren que todos los elementos tengan el mismo tipo de datos y tamaño de almacenamiento. La mayoría de estos lenguajes también restringen cada índice a un intervalo finito de enteros, que permanece fijo durante toda la vida útil de la variable de matriz. De hecho, en algunos lenguajes compilados , los rangos de índices pueden tener que conocerse en tiempo de compilación .
Por otro lado, algunos lenguajes de programación ofrecen tipos de array más flexibles que permiten la indexación mediante valores arbitrarios, como números de coma flotante , cadenas de caracteres , objetos , referencias , etc. Estos valores de índice no pueden restringirse a un intervalo, y mucho menos a un intervalo fijo. Por lo tanto, estos lenguajes suelen permitir la creación de nuevos elementos arbitrarios en cualquier momento. Esta elección impide la implementación de los tipos de array como estructuras de datos de array. Es decir, estos lenguajes utilizan una sintaxis similar a la de los arrays para implementar una semántica asociativa de array más general , y por lo tanto deben implementarse mediante una tabla hash u otra estructura de datos de búsqueda .
Soporte de idiomas
Tipo
Los lenguajes tienen diferentes maneras de definir un tipo de arreglo. Por ejemplo, en C, un arreglo es en realidad un bloque de memoria contigua, que se trata esencialmente como un puntero . [ 8 ] En tales casos, las declaraciones de arreglos pueden convertirse en punteros:
int a [ 10 ]; // arreglo 'a' de 10 enteros int * p = a ; // 'p' apunta al primer elemento de 'a'void foo ( int arr []) { // el parámetro 'arr' es un int[] // 'arr' se convierte en un puntero a su primer elemento }Sin embargo, en otros lenguajes, como Java , un array es un tipo real. Para cualquier tipo T, tiene un tipo de array correspondiente T[], que es un objeto con un lengthcampo. [ 9 ]
int [] a = new int [ 5 ] ; // declara un array 'a' de 5 enterosMatrices multidimensionales

El número de índices necesarios para especificar un elemento se denomina dimensión , dimensionalidad o rango del tipo de matriz. [ a ]
Existen dos formas comunes de admitir matrices multidimensionales.
Mediante seguimiento de puntero
Muchos lenguajes solo admiten arreglos unidimensionales. En esos lenguajes, un arreglo multidimensional se representa típicamente mediante un vector de Iliffe , un arreglo unidimensional de referencias a arreglos de una dimensión menos. Un arreglo bidimensional, en particular, se implementaría como un vector de punteros a sus filas. [ 10 ] Así, se accedería a un elemento en la fila i y la columna j de un arreglo A mediante doble indexación ( en notación típica). Esta forma de emular arreglos multidimensionales permite la creación de arreglos irregulares , donde cada fila puede tener un tamaño diferente o , en general, donde el rango válido de cada índice depende de los valores de todos los índices precedentes.A[i][j]
Esta representación para matrices multidimensionales es bastante común en el software C y C++. Sin embargo, C y C++ utilizarán una fórmula de indexación lineal para matrices multidimensionales que se declaran con un tamaño constante en tiempo de compilación, por ejemplo, mediante o , en lugar de la tradicional . [ 11 ]inta[10][20]inta[m][n]int**a
El estándar C99 introdujo tipos de matrices de longitud variable que permiten definir tipos de matrices con dimensiones calculadas en tiempo de ejecución. La matriz dinámica 4D se puede construir utilizando un puntero a una matriz 4D, por ejemplo . Se accede a los elementos individuales desreferenciando primero un puntero a la matriz y luego indexándolos, por ejemplo . Alternativamente, las matrices nd se pueden declarar como punteros a su primer elemento, que es una matriz de dimensión (n-1), por ejemplo, y se accede a ellas utilizando una sintaxis más idiomática, por ejemplo .int(*arr)[t][u][v][w]=malloc(sizeof*arr);(*arr)[i][j][k][l]int(*arr)[u][v][w]=malloc(t*sizeof*arr);arr[i][j][k][l]
Mediante cálculo
Algunos lenguajes permiten el cálculo directo de la ubicación de los elementos. Los lenguajes con cálculo directo de ubicaciones de elementos suelen encerrar la lista de subíndices entre un único par de delimitadores, por ejemplo, (foo,bar,baz)( FORTRAN , PL/I ), ( ALGOL 60 , Pascal ), en lugar de colocar cada subíndice entre un par de delimitadores, por ejemplo, . El orden en que se almacenan los elementos de la matriz difiere entre lenguajes, por ejemplo, FORTRAN tiene matrices por filas, mientras que PL/I tiene matrices por columnas.[foo,bar,baz][foo][bar][baz]
Notación de indexación
La mayoría de los lenguajes de programación que admiten arreglos admiten las operaciones de almacenamiento y selecciónA(i,j) , y tienen una sintaxis especial para la indexación. Los lenguajes antiguos usaban paréntesis, por ejemplo , como en FORTRAN; otros optan por corchetes, por ejemplo A[i,j]o A[i][j], como en Algol 60 y Pascal (para distinguirlos del uso de paréntesis para llamadas a funciones ).
Tipos de índice
Los tipos de datos de matriz se implementan con mayor frecuencia como estructuras de matriz: con índices restringidos a valores enteros (o totalmente ordenados), rangos de índices fijos al crear la matriz y direccionamiento de elementos multilineal. Este era el caso en la mayoría de los lenguajes de "tercera generación" y sigue siéndolo en la mayoría de los lenguajes de programación de sistemas como Ada , C y C++ . Sin embargo, en algunos lenguajes, los tipos de datos de matriz tienen la semántica de matrices asociativas, con índices de tipo arbitrario y creación dinámica de elementos. Este es el caso en algunos lenguajes de scripting como Awk y Lua , y en algunos tipos de matriz proporcionados por las bibliotecas estándar de C++ .
Comprobación de límites
Algunos lenguajes (como Pascal y Modula) realizan comprobaciones de límites en cada acceso, generando una excepción o abortando el programa cuando algún índice se encuentra fuera de su rango válido. Los compiladores pueden permitir desactivar estas comprobaciones para priorizar la velocidad sobre la seguridad. Otros lenguajes (como FORTRAN y C) confían en el programador y no realizan ninguna comprobación. Los buenos compiladores también pueden analizar el programa para determinar el rango de valores posibles que puede tener el índice, y este análisis puede llevar a la eliminación de las comprobaciones de límites .
Origen del índice
Algunos lenguajes, como C, solo proporcionan tipos de arreglos con índice base cero , para los cuales el valor mínimo válido para cualquier índice es 0. [ 12 ] Esta elección es conveniente para la implementación de arreglos y el cálculo de direcciones. Con un lenguaje como C, se puede definir un puntero al interior de cualquier arreglo que actuará simbólicamente como un pseudo-arreglo que admite índices negativos. Esto funciona solo porque C no verifica si un índice está dentro de los límites cuando se utiliza.
Otros lenguajes solo ofrecen tipos de matrices con índice base 1 , donde cada índice comienza en 1; esta es la convención tradicional en matemáticas para matrices y secuencias matemáticas . Algunos lenguajes, como Pascal y Lua, admiten tipos de matrices con índice base n , cuyos índices mínimos válidos son elegidos por el programador. Las ventajas relativas de cada opción han sido objeto de un acalorado debate. La indexación con índice base cero puede evitar errores de índices desfasados o errores de tipo "fencepost" . [ 13 ]
Índice más alto
La relación entre los números que aparecen en la declaración de un array y el índice de su último elemento también varía según el lenguaje de programación. En muchos lenguajes (como C), se debe especificar el número de elementos del array; mientras que en otros (como Pascal y Visual Basic .NET ) se debe especificar el valor numérico del índice del último elemento. Esta distinción no existe en lenguajes donde los índices comienzan en 1, como Lua .
álgebra de matrices
Algunos lenguajes de programación admiten la programación con matrices , donde las operaciones y funciones definidas para ciertos tipos de datos se extienden implícitamente a matrices de elementos de esos tipos. Así, se puede escribir A + B para sumar los elementos correspondientes de dos matrices A y B. Por lo general, estos lenguajes proporcionan tanto la multiplicación elemento a elemento como el producto matricial estándar del álgebra lineal , y la representación del operador * varía según el lenguaje.
Los lenguajes que ofrecen capacidades de programación de matrices se han multiplicado desde las innovaciones en este ámbito de APL . Estas son capacidades fundamentales de lenguajes específicos de dominio como GAUSS , IDL , Matlab y Mathematica . También son esenciales en lenguajes más recientes, como Julia y las versiones recientes de Fortran . Estas capacidades también se proporcionan a través de bibliotecas de extensión estándar para otros lenguajes de programación de propósito general (como la biblioteca NumPy, ampliamente utilizada en Python ).
Tipos de cadena y matrices
Muchos lenguajes proporcionan un tipo de dato de cadena integrado , con notación especializada (" literales de cadena ") para construir valores de ese tipo. En algunos lenguajes (como C), una cadena es simplemente una matriz de caracteres, o se maneja de forma muy similar. [ 14 ] Otros lenguajes, como Pascal , pueden proporcionar operaciones muy diferentes para cadenas y matrices.
Consultas de rango de índice de matriz
Algunos lenguajes de programación ofrecen operaciones que devuelven el tamaño (número de elementos) de un vector o, de forma más general, el rango de cada índice de un array. En C y C++, los arrays no admiten esta size()función, por lo que los programadores suelen tener que declarar una variable aparte para almacenar el tamaño y pasarla a los procedimientos como parámetro independiente.
Los elementos de una matriz recién creada pueden tener valores indefinidos (como en C), o pueden estar definidos con un valor "predeterminado" específico, como 0 o un puntero nulo (como en Java).
En C++, un std::vectorobjeto admite las operaciones de almacenamiento , selección y adición con las características de rendimiento descritas anteriormente. [ 15 ] Se puede consultar el tamaño de los vectores y redimensionarlos. También se admiten operaciones más lentas, como la inserción de un elemento en el medio.
Rebanar
Una operación de segmentación de matrices toma un subconjunto de los elementos de una entidad de tipo matriz (valor o variable) y luego los ensambla como otra entidad de tipo matriz, posiblemente con otros índices. Si los tipos de matriz se implementan como estructuras de matriz, muchas operaciones de segmentación útiles (como seleccionar una submatriz, intercambiar índices o invertir la dirección de los índices) se pueden realizar de manera muy eficiente manipulando el vector dope de la estructura. Las posibles segmentaciones dependen de los detalles de la implementación: por ejemplo, Fortran permite segmentar una columna de una variable de matriz, pero no una fila, y tratarla como un vector.
Por otro lado, son posibles otras operaciones de segmentación cuando los tipos de matrices se implementan de otras maneras.
Cambiar tamaño
Algunos lenguajes permiten el uso de matrices dinámicas (también llamadas redimensionables, ampliables o extensibles): variables de matriz cuyos rangos de índices pueden expandirse en cualquier momento después de su creación, sin modificar los valores de sus elementos actuales.
Para matrices unidimensionales, esta funcionalidad puede proporcionarse como una operación que incrementa el tamaño de la matriz A en uno y luego establece el valor del último elemento a x . Otros tipos de matrices (como las cadenas de Pascal) proporcionan un operador de concatenación, que puede usarse junto con el seccionamiento para lograr ese efecto y más. En algunos lenguajes, asignar un valor a un elemento de una matriz extiende automáticamente la matriz, si es necesario, para incluir ese elemento. En otros tipos de matrices, un seccionamiento puede reemplazarse por una matriz de diferente tamaño, con los elementos subsiguientes renumerados en consecuencia , como en la asignación de lista de Python , que inserta tres nuevos elementos (10, 20 y 30) antes del elemento " A [5]". Las matrices redimensionables son conceptualmente similares a las listas , y ambos conceptos son sinónimos en algunos lenguajes.append(A,x) A[5:5] = [10,20,30]
Un array extensible puede implementarse como un array de tamaño fijo, con un contador que registra cuántos elementos se están utilizando. La appendoperación simplemente incrementa el contador hasta que se utiliza todo el array, momento en el que appendpuede configurarse para que falle. Esta es una implementación de un array dinámico con capacidad fija, como en el stringtipo de Pascal. Alternativamente, la appendoperación puede reasignar el array subyacente a un tamaño mayor y copiar los elementos antiguos a la nueva área.
Véase también
Notas
- ↑ Esta nomenclatura entra en conflicto con el concepto de dimensión en álgebra lineal, que expresa la forma de una matriz . Así, una matriz de números con 5 filas y 4 columnas, es decir, 20 elementos, se dice que tiene dimensión 2 en contextos informáticos, pero representa una matriz que se dice que es de 4×5 dimensiones. Además, el significado de "rango" en informática entra en conflicto con la noción de rango tensorial , que es una generalización del concepto de rango de una matriz en álgebra lineal .
Referencias
- 1 2 Robert W. Sebesta (2001) Conceptos de lenguajes de programación . Addison-Wesley. 4.ª edición (1998), 5.ª edición (2001), ISBN 9780201385960
- ↑ "Introducción a los tensores | TensorFlow Core" . TensorFlow .
- ↑ K. Jensen y Niklaus Wirth, Manual de usuario e informe de PASCAL . Springer. Edición de bolsillo (2007), 184 páginas, ISBN 978-3540069508
- ↑ John Mitchell, Conceptos de lenguajes de programación . Cambridge University Press.
- ↑ Lukham, Suzuki (1979), "Verificación de operaciones con matrices, registros y punteros en Pascal". ACM Transactions on Programming Languages and Systems 1 (2), 226 – 244.
- ↑ Deitel, Harvey M.; Deitel, Paul J. (2005). C# para programadores . Prentice Hall Professional. pág. 303. ISBN 978-0-13-246591-5Consultado el 22 de mayo de 2024 .
- ↑ Friesen, Jeff (5 de marzo de 2014). Aprende Java para el desarrollo de Android: Edición Java 8 y Android 5. Apress. pág. 56. ISBN 978-1-4302-6455-2Consultado el 22 de mayo de 2024 .
- ↑ "Declaración de matriz" . cppreference.com . cppreference . Consultado el 15 de noviembre de 2025 .
- ↑ "Arreglos (Tutoriales de Java)" . docs.oracle.com . Oracle Corporation . Consultado el 15 de noviembre de 2025 .
- ↑ Van der Linden, Peter (1994). Expert C Programming: Deep C Secrets . Englewood Cliffs, NJ: SunSoft Press. ISBN 978-0-13-177429-2.
- ↑ Brian W. Kernighan y Dennis M. Ritchie (1988), El lenguaje de programación C. Prentice-Hall, pág. 81.
- ↑ Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C (2.ª ed.). Englewood Cliffs, NJ: Prentice Hall. pág. 24. ISBN 978-0-13-110370-2.
- ↑ Edsger W. Dijkstra , " Por qué la numeración debería comenzar en cero "
- ↑ "Cadenas de bytes terminadas en nulo" . cppreference.com . cppreference.com . Consultado el 15 de noviembre de 2025 .
- ↑ "std::vector" . cppreference.com . cppreference.com . Consultado el 15 de noviembre de 2025 .
Enlaces externos
- Diccionario de algoritmos y estructuras de datos del NIST: Arreglos
- Matrices
- Tipos de datos
- Tipos de datos compuestos