Looking for c Answers? Try Ask4KnowledgeBase
Looking for c Keywords? Try Ask4Keywords

C LanguageArrays


Introducción

Las matrices son tipos de datos derivados, que representan una colección ordenada de valores ("elementos") de otro tipo. La mayoría de las matrices en C tienen un número fijo de elementos de cualquier tipo, y su representación almacena los elementos de forma contigua en la memoria sin espacios ni rellenos. C permite matrices multidimensionales cuyos elementos son otras matrices y también matrices de punteros.

C admite matrices asignadas dinámicamente cuyo tamaño se determina en el tiempo de ejecución. C99 y posteriores admiten matrices de longitud variable o VLA.

Sintaxis

  • escriba nombre [longitud]; / * Definir matriz de 'tipo' con nombre 'nombre' y longitud 'longitud'. * /
  • int arr [10] = {0}; / * Definir una matriz e inicializar TODOS los elementos a 0. * /
  • int arr [10] = {42}; / * Definir una matriz e inicializar los primeros elementos a 42 y el resto a 0. * /
  • int arr [] = {4, 2, 3, 1}; / * Definir e inicializar una matriz de longitud 4. * /
  • arr [n] = valor; / * Establecer valor en el índice n. * /
  • valor = arr [n]; / * Obtener valor en el índice n. * /

Observaciones

¿Por qué necesitamos matrices?

Las matrices proporcionan una forma de organizar los objetos en un agregado con su propio significado. Por ejemplo, cadenas de C son matrices de caracteres ( char s), y una cadena como "Hola, mundo!" tiene un significado como un agregado que no es inherente a los caracteres individualmente. De manera similar, las matrices se usan comúnmente para representar vectores matemáticos y matrices, así como listas de muchos tipos. Además, sin una forma de agrupar los elementos, uno tendría que abordar cada uno individualmente, como a través de variables separadas. No solo es difícil de manejar, sino que no se adapta fácilmente a colecciones de diferentes longitudes.

Las matrices se convierten implícitamente a punteros en la mayoría de los contextos .

Excepto cuando aparece como el operando de la sizeof operador, el _Alignof operador (C2011), o el unario & operador (dirección-de), o como un literal de cadena utilizado para inicializar un (otro) de matriz, una matriz se convierte implícitamente en ( "decae a") un puntero a su primer elemento. Esta conversión implícita está estrechamente relacionada con la definición del operador de subíndice de matriz ( [] ): la expresión arr[idx] se define como equivalente a *(arr + idx) . Además, dado que la aritmética de punteros es conmutativa, *(arr + idx) también es equivalente a *(idx + arr) , que a su vez es equivalente a idx[arr] . Todas esas expresiones son válidas y se evalúan con el mismo valor, siempre que idx o arr sean un puntero (o una matriz, que decaiga en un puntero), la otra es un número entero, y el entero es un índice válido en la matriz a la que apunta el puntero.

Como caso especial, observe que &(arr[0]) es equivalente a &*(arr + 0) , lo que simplifica a arr . Todas esas expresiones son intercambiables siempre que la última se desintegre a un puntero. Esto simplemente expresa nuevamente que una matriz se desintegra en un puntero a su primer elemento.

Por el contrario, si la dirección del operador se aplica a una matriz de tipo T[N] ( es decir, &arr ), el resultado tiene el tipo T (*)[N] y apunta a toda la matriz. Esto es distinto de un puntero al primer elemento de la matriz al menos con respecto a la aritmética de punteros, que se define en términos del tamaño del tipo apuntado.

Los parámetros de función no son matrices .

void foo(int a[], int n);
void foo(int *a, int n);

Aunque la primera declaración de foo usa una sintaxis similar a a matriz para el parámetro a , dicha sintaxis se usa para declarar que un parámetro de función declara ese parámetro como un puntero al tipo de elemento de la matriz. Por lo tanto, la segunda firma para foo() es semánticamente idéntica a la primera. Esto corresponde a la caída de los valores de matriz a los punteros donde aparecen como argumentos a una llamada de función, de modo que si una variable y un parámetro de función se declaran con el mismo tipo de matriz, el valor de esa variable es adecuado para su uso en una llamada de función como el Argumento asociado al parámetro.

Arrays Ejemplos relacionados