C LanguageArray


introduzione

Le matrici sono tipi di dati derivati, che rappresentano una raccolta ordinata di valori ("elementi") di un altro tipo. La maggior parte degli array in C ha un numero fisso di elementi di qualsiasi tipo, e la sua rappresentazione memorizza gli elementi in modo contiguo nella memoria senza spazi vuoti o padding. C consente array multidimensionali i cui elementi sono altri array e anche matrici di puntatori.

C supporta matrici allocate dinamicamente le cui dimensioni sono determinate in fase di esecuzione. C99 e versioni successive supporta matrici di lunghezza variabile o VLA.

Sintassi

  • nome del tipo [lunghezza]; / * Definisce la matrice di 'tipo' con nome 'nome' e lunghezza 'lunghezza'. * /
  • int arr [10] = {0}; / * Definire una matrice e inizializzare TUTTI gli elementi a 0. * /
  • int arr [10] = {42}; / * Definire una matrice e inizializzare i primi elementi a 42 e il resto a 0. * /
  • int arr [] = {4, 2, 3, 1}; / * Definire e inizializzare un array di lunghezza 4. * /
  • arr [n] = valore; / * Imposta il valore all'indice n. * /
  • value = arr [n]; / * Ottieni valore all'indice n. * /

Osservazioni

Perché abbiamo bisogno di array?

Gli array forniscono un modo per organizzare gli oggetti in un aggregato con il proprio significato. Ad esempio, le stringhe C sono matrici di caratteri ( char s) e una stringa come "Hello, World!" ha un significato come un aggregato che non è inerente ai personaggi individualmente. Allo stesso modo, gli array sono comunemente usati per rappresentare vettori e matrici matematiche, così come liste di molti tipi. Inoltre, senza un modo per raggruppare gli elementi, bisognerebbe affrontarli individualmente, ad esempio tramite variabili separate. Non solo è ingombrante, non ospita facilmente raccolte di lunghezze diverse.

Gli array sono convertiti implicitamente in puntatori nella maggior parte dei contesti .

Tranne quando appare come l'operando dell'operatore sizeof , l'operatore _Alignof (C2011), o l'operatore unario & (indirizzo-di), o come letterale stringa usato per inizializzare un (altro) array, una matrice viene convertita implicitamente in ( "decade") un puntatore al suo primo elemento. Questa conversione implicita è strettamente accoppiata alla definizione dell'operatore di sottoscrizione dell'array ( [] ): l'espressione arr[idx] è definita come equivalente a *(arr + idx) . Inoltre, poiché l'aritmetica del puntatore è commutativa, *(arr + idx) è anche equivalente a *(idx + arr) , che a sua volta è equivalente a idx[arr] . Tutte queste espressioni sono valide e valutano allo stesso valore, a condizione che idx o arr sia un puntatore (o un array, che decompone a un puntatore), l'altro è un numero intero e il numero intero è un indice valido nell'array a cui punta il puntatore.

Come caso speciale, osserva che &(arr[0]) è equivalente a &*(arr + 0) , che semplifica l' arr . Tutte queste espressioni sono intercambiabili ovunque l'ultimo decadimento di un puntatore. Questo semplicemente esprime ancora una volta che un array decade in un puntatore al suo primo elemento.

Al contrario, se l'operatore address-of viene applicato a una matrice di tipo T[N] ( ie &arr ), allora il risultato ha tipo T (*)[N] e punta all'intero array. Questo è distinto da un puntatore al primo elemento dell'array, almeno rispetto all'aritmetica del puntatore, che è definita in termini della dimensione del tipo puntato.

I parametri di funzione non sono matrici .

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

Sebbene la prima dichiarazione di foo utilizzi la sintassi di tipo array per il parametro a , tale sintassi viene utilizzata per dichiarare un parametro di funzione che dichiara tale parametro come puntatore al tipo di elemento dell'array. Pertanto, la seconda firma per foo() è semanticamente identica alla prima. Ciò corrisponde al decadimento dei valori di matrice nei puntatori in cui vengono visualizzati come argomenti di una chiamata di funzione, in modo tale che se una variabile e un parametro di funzione vengono dichiarati con lo stesso tipo di matrice, il valore di tale variabile è adatto per l'uso in una chiamata di funzione come argomento associato al parametro.

Array Esempi correlati