logo

Matrice di puntatori in C

In C, un array di puntatori è una raccolta omogenea di variabili puntatore indicizzate che sono riferimenti a una posizione di memoria. Viene generalmente utilizzato nella programmazione C quando vogliamo puntare a più posizioni di memoria con un tipo di dati simile nel nostro programma C. Possiamo accedere ai dati dereferenziando il puntatore che li punta.

Sintassi:

pointer_type *array_name [array_size];>

Qui,



    pointer_type: tipo di dati a cui punta il puntatore. array_name: nome dell'array di puntatori. array_size: dimensione dell'array di puntatori.

Nota: È importante tenere presente la precedenza e l'associatività degli operatori nell'array di dichiarazioni di puntatori di tipo diverso poiché una singola modifica significherà una cosa completamente diversa. Ad esempio, racchiudere *nome_array tra parentesi significherà che nome_array è un puntatore a un array.

Esempio:

C




// C program to demonstrate the use of array of pointers> #include> int> main()> {> >// declaring some temp variables> >int> var1 = 10;> >int> var2 = 20;> >int> var3 = 30;> >// array of pointers to integers> >int>* ptr_arr[3] = { &var1, &var2, &var3 };> >// traversing using loop> >for> (>int> i = 0; i <3; i++) {> >printf>(>'Value of var%d: %d Address: %p '>, i + 1, *ptr_arr[i], ptr_arr[i]);> >}> >return> 0;> }>

>

>

Produzione

Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c>

Spiegazione:

Come mostrato nell'esempio precedente, ogni elemento dell'array è un puntatore che punta a un numero intero. Possiamo accedere al valore di questi numeri interi selezionando prima l'elemento dell'array e poi dereferenziandolo per ottenere il valore.

Matrice di puntatori al carattere

Una delle principali applicazioni dell'array di puntatori è la memorizzazione di più stringhe come array di puntatori a caratteri. Qui ogni puntatore nell'array è un puntatore a carattere che punta al primo carattere della stringa.

Sintassi:

volpe contro lupo
char *array_name [array_size];>

Successivamente, possiamo assegnare una stringa di qualsiasi lunghezza a questi puntatori.

Esempio:

C




char>* arr[5]> >= {>'gfg'>,>'geek'>,>'Geek'>,>'Geeks'>,>'techcodeview.com'> }>

>

>


Questo metodo di memorizzazione delle stringhe presenta il vantaggio del tradizionale array di stringhe. Consideriamo i due esempi seguenti:

Esempio 1:

C




// C Program to print Array of strings without array of pointers> #include> int> main()> {> >char> str[3][10] = {>'Geek'>,>'Geeks'>,>'Geekfor'> };> >printf>(>'String array Elements are: '>);> >for> (>int> i = 0; i <3; i++) {> >printf>(>'%s '>, str[i]);> >}> >return> 0;> }>

>

>

Produzione

String array Elements are: Geek Geeks Geekfor>

Nel programma sopra abbiamo dichiarato le 3 righe e le 10 colonne del nostro array di stringhe. Ma a causa della predefinizione della dimensione dell'array di stringhe, il consumo di spazio del programma aumenta se la memoria non viene utilizzata correttamente o lasciata inutilizzata. Ora proviamo a memorizzare le stesse stringhe in un array di puntatori.

Esempio 2:

C




// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> >char>* arr[3] = {>'geek'>,>'Geeks'>,>'Geeksfor'> };> >for> (>int> i = 0; i <3; i++) {> >printf>(>'%s '>, arr[i]);> >}> >return> 0;> }>

>

vlc per scaricare youtube

>

Produzione

geek Geeks Geeksfor>

In questo caso, la memoria totale utilizzata è quella richiesta per memorizzare stringhe e puntatori senza lasciare spazio vuoto, risparmiando quindi molto spazio sprecato. Possiamo capirlo utilizzando l'immagine mostrata sotto.

rappresentazione-della-memoria-di-un-array-di-stringhe

Lo spazio occupato dall'array di puntatori ai caratteri è rappresentato da blocchi pieni di colore verde esclusa la memoria necessaria per memorizzare il puntatore mentre lo spazio occupato dall'array di stringhe comprende sia blocchi pieni che verde chiaro.

Matrice di puntatori a tipi diversi

Non solo possiamo definire l'array di puntatori per tipi di dati di base come int, char, float, ecc. ma possiamo anche definirli per tipi di dati derivati ​​e definiti dall'utente come array, strutture, ecc. Consideriamo l'esempio seguente in cui creiamo un array di puntatori che puntano a una funzione per eseguire le diverse operazioni.

Esempio:

C




// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(>int> a,>int> b) {> >printf>(>'Sum : %d '>, a + b);> }> void> subtract(>int> a,>int> b) {> >printf>(>'Difference : %d '>, a - b);> }> void> multiply(>int> a,>int> b) {> >printf>(>'Product : %d '>, a * b);> }> void> divide(>int> a,>int> b) {> >printf>(>'Quotient : %d'>, a / b);> }> int> main() {> >int> x = 50, y = 5;> >// array of pointers to function of return type int> >void> (*arr[4])(>int>,>int>)> >= { &add, &subtract, &multiply, ÷ };> >for> (>int> i = 0; i <4; i++) {> >arr[i](x, y);> >}> >return> 0;> }>

>

>

Produzione

Sum : 55 Difference : 45 Product : 250 Quotient : 10>

Applicazione di array di puntatori

Una serie di puntatori è utile in un'ampia gamma di casi. Alcune di queste applicazioni sono elencate di seguito:

  • Viene comunemente utilizzato per memorizzare più stringhe.
  • Viene utilizzato anche per implementare LinkedHashMap in C e anche nella tecnica Chaining di risoluzione delle collisioni in Hashing.
  • Viene utilizzato negli algoritmi di ordinamento come il bucket sort.
  • Può essere utilizzato con qualsiasi tipo di puntatore quindi è utile quando abbiamo dichiarazioni separate di più entità e vogliamo memorizzarle in un unico posto.

Svantaggi dell'array di puntatori

La serie di puntatori presenta anche una buona dose di svantaggi e dovrebbe essere utilizzata quando i vantaggi superano gli svantaggi. Alcuni degli svantaggi dell'array di puntatori sono:

    Maggiore consumo di memoria: un array di puntatori richiede più memoria rispetto agli array semplici a causa dello spazio aggiuntivo richiesto per memorizzare i puntatori. Complessità: un array di puntatori potrebbe essere complesso da utilizzare rispetto a un array semplice. Incline ai bug: poiché utilizziamo i puntatori, tutti i bug associati ai puntatori ne derivano, quindi dobbiamo gestirli con attenzione.

Articolo correlato: Puntatore a un array | Puntatore di matrice