# C/Vettori e puntatori/Vettori

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
In linguaggio C gli array, o vettori, sono strutture di dati che contengono una serie di elementi. Ogni elemento di un array va considerato al pari di una variabile e contiene, quindi, un unico dato.

## Caratteristiche

In C, a differenza di alcuni linguaggi di programmazione ad alto livello, ogni array è caratterizzato da un unico tipo di dati e da un numero fisso di elementi (definito al momento della creazione dell'array).
Ad esempio, è possibile definire un array di interi (int) costituito da 20 elementi. Tale array non potrà contenere dati che non siano interi né potrà contenere più di 20 elementi. (vedi la sezione Buffer overflow)
Ogni elemento dell'array è identificato da un indice, cioè un numero intero che rappresenta la posizione di quell'elemento nell'array. Gli indici possibili vanno da 0 al numero di elementi dell'array diminuito di uno. Quindi il primo elemento sarà identificato dall'indice 0, il secondo dall'indice 1, il terzo dall'indice 2 e così via. In C non è possibile associare a un elemento di un array un indice che non sia un numero intero (cioè non è possibile creare array associativi).

## Sintassi

Per dichiarare un array (allocato nella memoria stack) in C si usa questa sintassi:
Per esempio il codice
definisce un array chiamato mioarray e composto da 10 elementi di tipo intero (int).
Per costruire un analogo array allocato dinamicamente nella memoria heap in C si deve operare così:
dove dim può essere conosciuto anche a runtime.
Per accedere ad un elemento di un qualsiasi array si usa questa sintassi:
Per esempio il codice
modifica il 5º elemento dell'array mioarray inserendovi il valore 1.
Si può anche inizializzare alla dichiarazione:
che produrrebbe un vettore come il seguente:
| arr[0] | 1 |
| arr[1] | 2 |
| arr[2] | 3 |
Per creare vettori multidimensionali si scrive questo:
Quest'istruzione produrrebbe un vettore come questo:
| | 0 | 1 | 2 |
| 0 | arr[0][0] | arr[0][1] | arr[0][2] |
| 1 | arr[1][0] | arr[1][1] | arr[1][2] |
| 2 | arr[2][0] | arr[2][1] | arr[2][2] |
in generale un vettore n-dimensionale si dichiara:
dove i1 ... iN sono le dimensioni di ciascuna dimensione, che equivale al vettore monodimensionale:
ossia al vettore di dimensioni i1×...×iN.

### Inizializzazione vettore multidimensionale

Un vettore multidimensionale viene inizializzato con la seguente sintassi:
dove conn si è indicato la coppia di graffe al cui interno ci sono gli inizializzatori relativi alla dimensione n. Per comprendere meglio ecco un esempio:
Se gli ultimi inizializzatori sono saltati allora si sottintende 0; può essere usata una sintassi semplificata considerandolo come un vettore monodimensionale:
nel caso di una matrice di interi:
saltando gli ultimi inizializzatori si sottintende ossia:
che definisce la matrice :
Sfruttando questa caratteristica è possibile inizializzare a 0 tutti gli elementi di un vettore n-dimensionale con la seguente sintassi:

### Vettori dinamici

L'ultimo standard ISO (C99) dà la possibilità di dichiarare vettori di lunghezza variabile ossia la dimensione del vettore è una variabile. Ecco un esempio:

### Assegnamento

È possibile assegnare un valore ad un elemento di un vettore. Si specifica l'indice tra parentesi quadre:

## Accesso

Si accede ad un elemento di un vettore specificando il suo indice tra parentesi quadre:
Il risultato dell'esecuzione del programma è:

## Array e puntatori

In C c'è un legame molto stretto fra array e puntatori. Infatti il nome associato a un array rappresenta un puntatore al primo elemento dell'array.
Osservare il codice seguente:
Non è però valido scrivere:
in quanto a rappresenta l'indirizzo dell'array ed è una costante.

## Buffer overflow

Quando si accede ad una posizione dell'array oltre i suoi limiti (per esempio accedendo all'11º elemento in un array da 10 elementi), si verifica il buffer overflow, cioè vengono letti o scritti dei dati in un'area di memoria che non appartiene all'array. I linguaggi C e C++, infatti, non prevedono nessun tipo di controllo sulle dimensioni delle array in fase di esecuzione.
Spesso il buffer overflow è generato da dati scorretti ricevuti in input e porta all'interruzione dell'esecuzione del programma con un errore. Il buffer overflow, inoltre, può essere sfruttato dai cracker per eseguire operazioni non consentite su un sistema. Infatti, creando appositamente dei dati da inviare al programma, è possibile generare un buffer overflow e modificare il comportamento del programma a proprio favore.