<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ C - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ C - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 13 May 2026 20:04:12 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/c/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tipi di Dato in C - Interi, Virgola Mobile e Void Spiegati ]]>
                </title>
                <description>
                    <![CDATA[ Tipi di Dato in C Ci sono parecchi modi per conservare dati in C, e sono tutti diversi l'uno dall'altro. I tipi di dato in cui le informazioni possono essere archiviate sono chiamati "data types". C perdona molto meno rispetto ad altri linguaggi per quanto riguarda i tipi di dato. ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/tipi-di-dato-in-c-interi-virgola-mobile-e-void-spiegati/</link>
                <guid isPermaLink="false">6470595cd35921064af70aa2</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Wed, 21 Jun 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/05/5f9c9cf3740569d1a4ca3517.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/data-types-in-c-integer-floating-point-and-void-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Data Types in C - Integer, Floating Point, and Void Explained</a>
      </p><h2 id="tipi-di-dato-in-c"><strong>Tipi di Dato in C</strong></h2><p>Ci sono parecchi modi per conservare dati in C, e sono tutti diversi l'uno dall'altro. I tipi di dato in cui le informazioni possono essere archiviate sono chiamati "data types". C perdona molto meno rispetto ad altri linguaggi per quanto riguarda i tipi di dato. Ne consegue che è importante comprendere i tipi di dato esistenti, le loro capacità e i loro limiti.</p><p>Una stranezza dei tipi di dato in C è che dipendono interamente dall'hardware sul quale stai eseguendo il codice. Un <code>int</code> nel tuo laptop sarà più piccolo rispetto a un <code>int</code> in un supercomputer, quindi conoscere i limiti dell'hardware sul quale stai lavorando è importante. Questa è anche la ragione per la quale i tipi di dato sono definiti con valori limite minimi e massimi - un valore <code>int</code>, come imparerai, potrà contenere valori da &nbsp;-32767 a 32767; su certe macchine sarà però in grado di conservare valori anche eccedenti.</p><p>Ci sono due categorie in cui possiamo suddividere valori numerici: interi (integers) e in virgola mobile (floating points numbers). Gli interi sono numeri interi. Possono essere positivi, negativi oppure zero. Numeri come -321, 497, 19345, e -976812 sono tutti perfettamente validi, mentre 4.5 non lo è perché non è un numero intero.</p><p>I numeri in virgola mobile sono numeri con decimali. Comprendono anche i numeri interi, -321, 497, 19345, e -976812 che sono tutti validi, ma anche 4,5, 0,0004, -324,984, e altri numeri non interi sono validi.</p><p>C ci consente di scegliere tra parecchie opzioni per i nostri tipi di dato in quanto sono tutti conservati nel computer in modi diversi. Ne consegue che è importante conoscere limiti e capacità di ciascun tipo di dato per potere scegliere quello più appropriato.</p><h2 id="tipi-di-dato-interi"><strong><strong>Tipi di dato </strong>Interi</strong></h2><h3 id="caratteri-char"><strong>Caratteri: <code>char</code></strong></h3><p><code>char</code> contiene caratteri - cose come lettere, punteggiatura e spazi. In un computer i caratteri sono conservati come numeri, pertanto <code>char</code> contiene valori interi che rappresentano caratteri. L'effettiva transcodifica viene descritta dallo standard ASCII. <a href="http://www.asciitable.com/">Ecco una comoda tabella</a> per cercare corrispondenze.</p><p>La dimensione reale, come tutti gli altri tipi di dato in C, dipende dall'hardware sul quale stai lavorando. Come minimo è di 8 bit, quindi contiene valori da 0 a 127. In alternativa si può usare un <code>char</code> con segno (<code>signed char</code>) che può contenere valori da &nbsp;-128 a 127.</p><h3 id="interi-standard-int"><strong>Interi Standard: <code>int</code></strong></h3><p>La quantità di memoria che può utilizzare un singolo <code>int</code> dipende dall'hardware. Tuttavia puoi aspettarti che un <code>int</code> sia almeno di 16 bit. Il che vuol dire che può conservare valori da -32,768 a 32,767, o più a seconda dell'hardware.</p><p>Come per tutti gli altri tipi di dato c'è una variante senza segno (<code>unsigned</code>) che può essere usata. Il dato contenuto in un tipo <code>unsigned int</code> può essere positivo e zero ma non negativo, quindi può contenere valori da 0 a 65,535, o più a seconda dell'hardware.</p><h3 id="interi-corti-short"><strong>Interi Corti: <code>short</code></strong></h3><p>Questo tipo di dato non viene usato spesso, ma è meglio sapere che esiste. Come l'<code>int</code> può conservare valori da -32768 a 32767. Diversamente da <code>int</code>, tuttavia, queste sono tutte le sue capacità. Ogniqualvolta puoi usare <code>short</code>, puoi anche usare <code>int</code>.</p><h3 id="interi-lunghi-long"><strong>Interi Lunghi: <code>long</code></strong></h3><p>Il tipo di dato <code>long</code> conserva interi come il tipo <code>int</code>, ma offre una gamma di valori maggiore al costo di più memoria. <code>long</code> usa almeno 32 bit, e può quindi contenere valori da -2,147,483,648 a 2,147,483,647. In alternativa puoi usare <code>unsigned long</code> per una gamma di valori da 0 a 4,294,967,295.</p><h3 id="interi-ancora-pi-lunghi-long-long"><strong>Interi Ancora Più Lunghi: <code>long long</code></strong></h3><p>Il tipo di dato <code>long long</code> è esagerato per quasi tutte le applicazioni, ma C ti consente comunque di usarlo. È in grado di conservare valori da &nbsp;−9,223,372,036,854,775,807 a 9,223,372,036,854,775,807. In alternativa, esagerando ulteriormente, c'è il tipo senza segno <code>unsigned long long</code>, che conserva valori da 0 a 18,446,744,073,709,551,615.</p><h2 id="tipi-di-dato-in-virgola-mobile"><strong>Tipi di Dato in Virgola Mobile</strong></h2><h3 id="numeri-in-virgola-mobile-base-float"><strong>Numeri in Virgola Mobile Base: <code>float</code></strong></h3><p><code>float</code> richiede almeno 32 bit per conservare il dato, ma offre fino a 6 cifre decimali da 1.2E-38 a 3.4E+38.</p><h3 id="doppi-double"><strong>Doppi: <code>double</code></strong></h3><p><code>double</code> richiede il doppio di memoria rispetto a <code>float</code> (quindi almeno 64 bit). In cambio può offrire fino a 15 cifre decimali da 2.3E-308 a 1.7E+308.</p><h3 id="ottenere-una-gamma-pi-ampia-di-double-long-double"><strong>Ottenere una gamma più ampia di <code>double</code>: <code>long double</code></strong></h3><p><code>long double</code> richiede almeno 80 bit. Pertanto può contenere fino a 19 cifre decimali da 3.4E-4932 a 1.1E+4932.</p><h2 id="scegliere-il-tipo-di-dato-giusto"><strong>Scegliere il tipo di dato giusto</strong></h2><p>C ti fa scegliere il tipo di dato e ti fa essere molto specifico e intenzionale sul modo in cui lo fai. Questo ti dà molto potere sul tuo codice, ma è importante scegliere quello giusto.</p><p>In generale, dovresti scegliere il tipo minimo per il tuo scopo. Se sai che conterai interi da 1 a 10, non ti serve un <code>long</code> e neppure un <code>double</code>. Se sai che non avrai mai valori negativi, appoggiati alle varianti <code>unsigned</code> dei rispettivi tipi di dato. Fornendo questa funzionalità invece che facendolo automaticamente, C è in grado di produrre codice molto leggero ed efficiente. Tuttavia dipende da te, come programmatore, capire capacità e limiti e scegliere in modo appropriato.</p><p>Possiamo usare la funzione <code>sizeof()</code> per verificare la dimensione di una variabile. Dai un'occhiata al seguente programma in &nbsp;C che mostra l'utilizzo dei diversi tipi:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int a = 1;
    
    char b ='G';
    
    double c = 3.14;
    
    printf("Hello World!\n");
 
    //stampa le variabili definite qui sopra assieme alle loro dimensioni
    printf("Ciao! Sono un carattere. Il mio valore è %c e "
           "la mia dimensione è %lu byte.\n", b,sizeof(char));
    //puoi anche usare sizeof(b) qui sopra
 
    printf("Ciao! Sono un intero. Il mio valore è %d e "
           "la mia dimensione è %lu  byte.\n", a,sizeof(int));
    //puoi anche usare sizeof(a) qui sopra
 
    printf("Ciao! Sono una variabile in virgola mobile."
           " Il mio valore è %lf e la mia dimensione è %lu byte.\n",c,sizeof(double));
    //puoi anche usare sizeof(c) qui sopra
 
    printf("Ciao! A presto. :)\n");
    return 0;
}</code></pre><h3 id="risultato-"><strong>Risultato:</strong></h3><pre><code class="language-text">Hello World!
Ciao! Sono un carattere. Il mio valore è G e la mia dimensione è 1 byte.
Ciao! Sono un intero. Il mio valore è 1 e la mia dimensione è 4  byte.
Ciao! Sono una variabile in virgola mobile. Il mio valore è 3.140000 e la mia dimensione è 8 byte.
Ciao! A presto. :)</code></pre><h2 id="il-tipo-void"><strong>Il Tipo Void</strong></h2><p><code>void</code> specifica che non c'è un valore disponibile. Viene usato in tre tipi di situazione:</p><h3 id="1-funzione-che-ritorna-void"><strong>1. Funzione che ritorna <code>void</code></strong></h3><p>Ci sono varie funzioni in C che non restituiscono alcun valore oppure puoi dire che restituiscono <code>void</code>. Una funzione senza valore di ritorno ha il tipo di valore ritornato <code>void</code>. Per esempio, <code>void exit (int status);</code></p><h3 id="2-argomenti-di-funzione-come-void"><strong>2. Argomenti di funzione come <code>void</code></strong></h3><p>Diverse funzioni in C non accettano parametri. Una funzione senza parametri può accettare un <code>void</code>. Per esempio, <code>int rand(void);</code></p><h3 id="3-puntatori-a-void"><strong>3. Puntatori a <code>void</code></strong></h3><p>Un puntatore di tipo <code>void *</code> rappresenta l'indirizzo di un oggetto, ma non il suo tipo. Per esempio una funzione di allocazione di memoria <code>void *malloc( size_t size);</code> ritorna un puntatore a <code>void</code>, che può essere convertito in qualsiasi altro tipo di dato.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Puntatori in C Spiegati - Non Sono Così Difficili Come Pensi ]]>
                </title>
                <description>
                    <![CDATA[ I puntatori sono probabilmente la funzionalità di C più difficile da capire. Tuttavia sono una delle funzionalità che rendono C un linguaggio eccellente. In questo articolo, partiremo dagli aspetti base dei puntatori fino ad arrivare al loro utilizzo con array, funzioni e strutture. Quindi rilassati, prendi un caffè, e preparati ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/puntatori-in-c-spiegati-non-sono-cosi-difficili-come-pensi/</link>
                <guid isPermaLink="false">646098a5410a4d066241b20e</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 12 Jun 2023 10:54:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/05/5f9c994c740569d1a4ca1ef5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/pointers-in-c-are-not-as-difficult-as-you-think/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Pointers in C Explained – They're Not as Difficult as You Think</a>
      </p><p>I puntatori sono probabilmente la funzionalità di C più difficile da capire. Tuttavia sono una delle funzionalità che rendono C un linguaggio eccellente.</p><p>In questo articolo, partiremo dagli aspetti base dei puntatori fino ad arrivare al loro utilizzo con array, funzioni e strutture.</p><p>Quindi rilassati, prendi un caffè, e preparati per imparare tutto sui puntatori.</p><h2 id="sommario"><strong>Sommario</strong></h2><h5 id="a-fondamenti"><strong><strong>A. F</strong>ondamenti</strong></h5><ol><li><a href="#1-cosa-sono-esattamente-i-puntatori">Cosa sono esattamente i puntatori?</a></li><li><a href="#2-definizione-e-notazione">Definizione e Notazione</a></li><li><a href="#2-alcuni-puntatori-speciali">Alcuni Puntatori Speciali</a></li><li><a href="#4-puntatori-aritmetici">Puntatori Aritmetici</a></li></ol><h5 id="b-array-e-stringhe"><strong><strong>B. Array </strong>e<strong> String</strong>he</strong></h5><ol><li><a href="#1-perche-puntatori-e-array">Perché puntatori e array?</a></li><li><a href="#2-array-1-d">Array 1-D</a></li><li><a href="#3-array-2-d">Array 2-D</a></li><li><a href="#4-stringhe">Stringhe</a></li><li><a href="#5-array-di-puntatori">Array di Puntatori</a></li><li><a href="#6-puntatori-ad-array">Puntatori ad Array</a></li></ol><h5 id="c-funzioni"><strong><strong>C. Fu</strong>nz<strong>ion</strong>i</strong></h5><ol><li><a href="#1-chiamata-per-valore-vs-chiamata-per-riferimento">Chiamata per Valore vs. Chiamata per Riferimento</a></li><li><a href="#2-puntatori-come-argomenti-di-funzione">Puntatori come Argomenti di Funzione</a></li><li><a href="#3-puntatori-come-valori-di-ritorno-da-funzione">Puntatori come Valori di Ritorno da Funzione</a></li><li><a href="#4-puntatore-a-funzione">Puntatore a Funzione</a></li><li><a href="#5-array-di-puntatori-a-funzioni">Array di Puntatori a Funzioni</a></li><li><a href="#6-puntatore-a-funzione-come-argomento">Puntatore a Funzione come Argomento</a></li></ol><h5 id="d-strutture"><strong><strong>D. </strong>Strutture</strong></h5><ol><li><a href="#1-puntatore-a-struttura">Puntatore a Struttura</a></li><li><a href="#2-array-di-strutture">Array di Strutture</a></li><li><a href="#3-puntatore-a-struttura-come-argomento">Puntatore a Struttura come Argomento</a></li></ol><h5 id="e-puntatore-a-puntatore"><strong><strong>E. </strong><a href="#puntatore-a-puntatore"><strong>P</strong>untatore a Puntatore</a></strong></h5><h5 id="f-conclusione"><strong><strong>F. </strong><a href="#conclusione"><strong>Conclusion</strong>e</a></strong></h5><p></p><h2 id="a-fondamenti-1"><strong><strong>A. </strong>Fondamenti</strong></h2><h3 id="1-cosa-sono-esattamente-i-puntatori"><strong><strong>1. </strong>Cosa sono esattamente i puntatori<strong>?</strong></strong></h3><p>Prima di passare alla definizione di puntatori, cerchiamo di capire cosa avviene quando scriviamo il seguente codice:</p><pre><code class="language-c">int digit = 42;
</code></pre><p>Un blocco di memoria è riservato dal compilatore per conservare un valore <code>int</code>. Il nome del blocco è <code>digit</code> e il valore assegnato a questo blocco è <code>42</code>.</p><p>Ora, per ricordare il blocco, a esso viene assegnato un <strong>indirizzo </strong>o un numero di posizione (diciamo 24650).</p><p>Il valore del numero di posizione non è importante per noi, visto che è un valore casuale. Tuttavia possiamo accedere a questo indirizzo usando il carattere <code>&amp;</code> (e commerciale) o <strong>indirizzo </strong>dell'operatore.</p><pre><code class="language-c">printf("Indirizzo di digit = %d.",&amp;digit);
 /* stampa "Indirizzo di digit = 24650. */
</code></pre><p>Possiamo ottenere il valore della variabile <code>digit</code> dal suo indirizzo usando un altro operatore, <code>*</code> (asterisco)<em>, </em>chiamato operatore di<em> </em><strong>riferimento indiretto </strong>o <strong>dereferenziazione</strong> o <strong>valore all'indirizzo</strong>.</p><pre><code class="language-c">printf("Valore di digit = %d.", *(&amp;digit);
 /* stampa "Valore di digit = 42. */
</code></pre><h3 id="2-definizione-e-notazione"><strong><strong>2. Defini</strong>z<strong>ion</strong>e<strong> </strong>e<strong> Nota</strong>z<strong>ion</strong>e</strong></h3><p>L'indirizzo di una variabile può essere conservato in un'altra variabile nota come variabile puntatore. La sintassi per conservare l'indirizzo di una variabile in un puntatore è:</p><pre><code class="language-c">tipoDato *nomeVariabilePuntatore = &amp;nomeVariabile;
</code></pre><p>Per la nostra variabile <code>digit</code>, ciò si può scrivere in questo modo:</p><pre><code class="language-c">int *addressOfDigit = &amp;digit;
</code></pre><p>oppure:</p><pre><code class="language-c">int *addressOfDigit;
addressOfDigit= &amp;digit;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/456d4568d6e2c00e377b9dfae76e1809.gif" class="kg-image" alt="Declaration and Definition" width="600" height="400" loading="lazy"></figure><p>Questo si può leggere come &nbsp;- <em>Un puntatore a<em> <code>int</code> (inte</em>ro<em>) <code>addressOfDigit</code></em> conserva l'<em> </em>indirizzo (<code>addressOf(&amp;)</code>) della variabile <em><code>digit</code>.</em></em></p><h4 id="alcuni-punti-da-capire-"><strong>Alcuni punti da capire:</strong></h4><p><code>tipoDato</code> – Dobbiamo dire al computer quale tipo di dato conterrà la variabile il cui indirizzo andremo a conservare. In questo caso <code>int</code> era il tipo di dato di &nbsp;<code>digit</code>.</p><p>Questo <strong>non</strong> vuol dire che <code>addressOfDigit</code> conserverà un valore di tipo <code>int</code>. Un puntatore a intero (come <code>addressOfDigit</code>) può <strong>solo</strong> conservare l'indirizzo di variabili di tipo <code>int</code>.</p><pre><code class="language-c">int variable1;
int variable2;
char variable3;
int *addressOfVariables;
</code></pre><p><code>*</code> – Una variabile puntatore è una variabile <em>speciale </em>nel senso che viene usata per conservare un indirizzo di un'altra variabile. Per differenziarla dalle altre variabili che non conservano un indirizzo, usiamo <code>*</code> come simbolo nella dichiarazione.</p><p>Qui possiamo assegnare l'indirizzo di &nbsp;<code>variable1</code> e <code>variable2</code> al puntatore di interi <code>addressOfVariables</code> ma non <code>variable3</code> visto che è di tipo <code>char</code>. Ci serverebbe una variabile puntatore a carattere per contenere il suo indirizzo.</p><p>Possiamo usare la nostra variabile puntatore <code>addressOfDigit</code> per stampare l'indirizzo e il valore di &nbsp;<code>digit</code> in questo modo:</p><pre><code class="language-c">printf("Indirizzo di digit = %d.", addressOfDigit);
 /* stampa "Indirizzo di digit = 24650." */
printf("Valore di digit = %d.", *addressOfDigit);
 /* stampa "Valore di digit = 42. */
</code></pre><p>Qui, <code>*addressOfDigit</code> può essere letto come <em>il valore all'indirizzo conservato in</em> <em><em><code>addressOfDigit</code>.</em></em></p><p>Nota che abbiamo usato <code>%d</code> come <strong>identificatore di formato </strong>per <code>addressOfDigit</code>. In effetti questo non è completamente corretto. L'identificatore corretto sarebbe <code>%p</code>.</p><p>Usando <code>%p</code>, l'indirizzo viene visualizzato come valore esadecimale. Un indirizzo di memoria può tuttavia essere visualizzato anche come intero oppure come valore ottale. Per questo, visto che non è il modo <em>interamente corretto,</em> viene mostrato un avvertimento.</p><pre><code class="language-c">int num = 5;
int *p = &amp;num;
printf("Indirizzo usando %%p = %p",p);
printf("Indirizzo usando %%d = %d",p);
printf("Indirizzo usando %%o = %o",p);
</code></pre><p>Questo il risultato in base al compilatore che sto usando:</p><pre><code class="language-c">Indirizzo usando %p = 000000000061FE00
Indirizzo usando %d = 6422016
Indirizzo usando %o = 30377000
</code></pre><blockquote>Questo è l'avvertimento mostrato quando usi &nbsp;%d - " warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' " ("avvertimento: format %d si aspetta argomenti di tipo 'int', ma l'argomento 2 è di tipo 'int *').</blockquote><h3 id="3-alcuni-puntatori-speciali"><strong><strong>3. </strong>Alcuni Puntatori Speciali</strong></h3><h4 id="il-puntatore-selvaggio"><strong>Il Puntatore Selvaggio</strong></h4><pre><code class="language-c">char *alphabetAddress; /* non inizializzato o puntatore selvaggio */
char alphabet = "a";
alphabetAddress = &amp;alphabet; /* ora non più puntatore selvaggio */
</code></pre><p>Quando abbiamo definito il nostro puntatore a carattere <code>alphabetAddress</code>, non lo abbiamo inizializzato.</p><p>Tali puntatori sono noti come <strong>puntatori selvaggi</strong> (wild pointers). Conservano un valore spazzatura (vale a dire l'indirizzo di memoria) di un byte che non sappiamo se sia riservato o meno (ricorda <code>int digit = 42;</code>, abbiamo riservato un indirizzo di memoria quando l'abbiamo dichiarata).</p><p>Supponiamo di dereferenziare un puntatore selvaggio e di assegnare un valore all'indirizzo di memoria al quale sta puntando. Questo provocherà un comportamento inatteso visto che andremo a scrivere dati in un blocco di memoria che potrebbe essere libero oppure riservato.</p><h4 id="puntatore-null"><strong>Puntatore Null</strong></h4><p>Per assicurarci di non avere un puntatore selvaggio, possiamo inizializzare un puntatore con un valore <code>NULL</code> , rendendolo un <strong>puntatore null </strong>(null pointer).</p><pre><code class="language-c">char *alphabetAddress = NULL /* Puntatore null */ 
</code></pre><p>Un puntatore null punta al nulla, oppure a un indirizzo di memoria al quale gli utenti non possono accedere.</p><h4 id="puntatore-void"><strong>Puntatore Void</strong></h4><p>Un <strong>puntatore void</strong> può essere usato per puntare a una variabile associata a qualsiasi tipo di dato. Può essere riutilizzato per puntare a qualsiasi tipo di dato vogliamo. Viene dichiarato in questo modo:</p><pre><code class="language-c">void *puntatoreANomeVariabile = NULL;
</code></pre><p>Vista la loro natura molto <em>generica</em>, sono anche noti come <strong>puntatori generici</strong> (<strong><strong>generic pointers</strong></strong>).</p><p>Con la loro flessibilità, i puntatori void sono anche dotati di qualche vincolo. I puntatori void <strong>non possono</strong> essere dereferenziati come qualsiasi altro puntatore. È necessaria un'appropriata conversione di tipo (<em>typecasting</em>).</p><pre><code class="language-c">void *pointer = NULL;
int number = 54;
char alphabet = "z";
pointer = &amp;number;
printf("Il valore di number = ", *pointer); /* Errore di compilazione */
/* Metodo corretto */
printf("Il valore di number = ", *(int *)pointer); /* stampa "Il valore di number = 54" */
pointer = &amp;alphabet;
printf("Il valore di alphabet = ", *pointer); /* Errore di compilazione */
printf("Il valore di alphabet = ", *(char *)pointer); /* stampa "Il valore di alphabet = z */
</code></pre><p>Allo stessa stregua, i puntatori void richiedono una conversione di tipo per eseguire operazioni aritmetiche.</p><p>I puntatori void sono di grande uso in C. Funzioni di libreria come <code>malloc()</code> e <code>calloc()</code> che allocano dinamicamente memoria, ritornano puntatori void. <code>qsort()</code>, una funzione integrata di ordinamento in C, riceve una funzione come suo argomento che a sua volta riceve puntatori void come suoi argomenti.</p><h4 id="puntatori-pendenti"><strong>Puntatori Pendenti</strong></h4><p>Un puntatore pendente (dangling pointer) punta a un indirizzo di memoria <strong>in uso</strong> per conservare una variabile. Visto che l'indirizzo a cui punta non è più riservato, l'uso potrebbe portare a risultati inaspettati.</p><pre><code class="language-c">main(){
  int *ptr;
  ptr = (int *)malloc(sizeof(int));
  *ptr = 1;
  printf("%d",*ptr); /* stampa 1 */
  free(ptr); /* deallocazione */
  *ptr = 5;
  printf("%d",*ptr); /* potrebbe o non potrebbe stampare 5 */
}
</code></pre><p>Anche se la memoria è stata deallocata da <code>free(ptr)</code>, il puntatore a intero <code>ptr</code> punta ancora a quell'indirizzo di memoria non più riservato.</p><h3 id="4-puntatori-aritmetici"><strong><strong>4. </strong>Puntatori Aritmetici</strong></h3><p>Ora sappiamo che i puntatori non sono come le altre variabili. Non conservano alcun valore, ma l'indirizzo di blocchi di memoria.</p><p>Pertanto dovrebbe essere piuttosto chiaro che non tutte le operazioni aritmetiche sarebbero valide con essi. Avrebbe senso moltiplicare o dividere due puntatori (<em>che contengono indirizzi)?</em></p><h4 id="i-puntatori-hanno-poche-ma-immensamente-utili-operazioni-valide-"><strong>I puntatori hanno poche ma immensamente utili operazioni valide<strong>:</strong></strong></h4><ol><li>Si può assegnare il valore di un puntatore a un altro solo se sono dello stesso tipo (a meno che non siano oggetto di conversione di tipo oppure uno di essi sia <code>void *</code>).</li></ol><pre><code class="language-c">int ManU = 1;
int *addressOfManU = &amp;ManU;
int *anotherAddressOfManU = NULL;
anotherAddressOfManU = addressOfManU; /* Valido */
double *wrongAddressOfManU = addressOfManU; /* Non Valido */
</code></pre><p>2. &nbsp; Puoi solo <strong>aggiungere</strong> o <strong>sottrarre interi</strong> ai puntatori.</p><pre><code class="language-c">int myArray = {3,6,9,12,15};
int *pointerToMyArray = &amp;myArray[0];
pointerToMyArray += 3; /* Valido */
pointerToMyArray *= 3; /* Non Valido */
</code></pre><p>Quando aggiungi (o sottrai) un intero (diciamo <code>n</code>) a un puntatore, <strong>non </strong>stai effettivamente aggiungendo (o sottraendo) <code>n</code> byte al valore del puntatore. Stai in realtà aggiungendo (o sottraendo) <em><code>n</code>-volte in byte la dimensione del tipo di dato della variabile puntata</em>.</p><pre><code class="language-c">int number = 5;
 /* Supponiamo che l'indirizzo di number sia 100 */
int *ptr = &amp;number;
int newAddress = ptr + 3;
 /* Uguale a ptr + 3 * sizeof(int) */
</code></pre><p>Il valore conservato in <code>newAddress</code> <strong>non</strong> sarà 103, ma <code>112</code>.</p><p>3. La <strong>sottrazione<strong> </strong></strong>e il<strong> confronto </strong>di puntatori è valida solo se entrambi sono membri dello stesso array. La sottrazione tra puntatori fornisce il numero di elementi che li separano.</p><pre><code class="language-c">int myArray = {3,6,9,12,15};
int sixthMultiple = 18;
int *pointer1 = &amp;myArray[0];
int *pointer2 = &amp;myArray[1];
int *pointer6 = &amp;sixthMuliple;
 /* Espressione valida */
if(pointer1 == pointer2)
pointer2 - pointer1;
 /* Espressione non valida */
if(pointer1 == pointer6)
pointer2 - pointer6
</code></pre><p>4. &nbsp;Puoi assegnare o confrontare un puntatore con &nbsp;<code>NULL</code>.</p><blockquote><em>L'unica eccezione alle regole qui sopra è che l'indirizzo del primo blocco di memoria dopo l'ultimo elemento di un array segua un puntatore aritmetico<em>.</em></em></blockquote><p>Puntatori e array coesistono. Queste valide manipolazioni di puntatori sono immensamente utili con gli array, e le discuteremo nella prossima sezione.</p><h2 id="b-array-e-stringhe-1"><strong><strong>B. Array </strong>e<strong> String</strong>he</strong></h2><!--kg-card-begin: markdown--><p><a name="1-perche-puntatori-e-array"></a></p>
<h3 id="1perchpuntatoriearray">1. Perché puntatori e array?</h3>
<!--kg-card-end: markdown--><p>In C, i puntatori e gli array hanno una relazione piuttosto forte.</p><p>La ragione per la quale <em>dovrebbero </em>essere discussi insieme è che quello che puoi ottenere con la notazione di array (<code>nomeArray[indice]</code>) può anche essere ottenuto con i puntatori, in genere più velocemente.</p><h3 id="2-array-1-d"><strong><strong>2. Array</strong> 1-D</strong></h3><p>Osserviamo cosa succede quando scriviamo <code>int myArray[5];</code>.</p><p>Cinque blocchi <strong>consecutivi</strong> di memoria a partire da <code>myArray[0]</code> fino a <code>myArray[4]</code> sono creati con valori spazzatura al loro interno. Ciascun blocco ha una dimensione di 4 byte.</p><p>Pertanto se l'indirizzo di <code>myArray[0]</code> è, diciamo, <code>100</code>, l'indirizzo dei restanti blocchi sarebbe <code>104</code>, <code>108</code>, <code>112</code> e <code>116</code>.</p><p>Dai un'occhiata al seguente codice:</p><pre><code class="language-c">int prime[5] = {2,3,5,7,11};
printf("Risultato usando &amp;prime = %d\n",&amp;prime);
printf("Risultato usando prime = %d\n",prime);
printf("Risultato usando &amp;prime[0] = %d\n",&amp;prime[0]);

/* Output */
Risultato usando &amp;prime = 6422016
Risultato usando prime = 6422016
Risultato usando &amp;prime[0] = 6422016
</code></pre><p>Quindi, <code>&amp;prime</code>, <code>prime</code>, e <code>&amp;prime[0]</code> danno tutti lo stesso indirizzo, giusto? Bene, aspetta e continua a leggere, perché avrai una sorpresa (e forse un po' di confusione).</p><p>Cerchiamo di incrementare &nbsp;<code>&amp;prime</code>, <code>prime</code>, e <code>&amp;prime[0]</code> di 1.</p><pre><code class="language-c">printf("Risultato usando &amp;prime = %d\n",&amp;prime + 1);
printf("Risultato usando prime = %d\n",prime + 1);
printf("Risultato usando &amp;prime[0] = %d\n",&amp;prime[0] + 1);

/* Output */
Risultato usando &amp;prime = 6422036
Risultato usando prime = 6422020
Risultato usando &amp;prime[0] = 6422020
</code></pre><p>Aspetta! Come mai il risultato di <code>&amp;prime + 1</code> è diverso dagli altri due? Perché <code>prime + 1</code> e <code>&amp;prime[0] + 1</code> sono ancora uguali? Rispondiamo a queste domande.</p><p><code>prime</code> e <code>&amp;prime[0]</code> puntano entrambi all'elemento 0 dell'array <code>prime</code>. Quindi il <strong>nome stesso di un array è a sua volta un puntatore all'elemento 0 dell'</strong> <strong><strong>array</strong></strong>.</p><p>Qui entrambi puntano al primo elemento di 4 byte di dimensione. Quando aggiungi 1 ad essi, ora puntano all'elemento con indice 1 dell'array. Ne consegue un aumento nell'indirizzo di 4.</p><p><code>&amp;prime</code>, d'altro canto, è un <strong>puntatore a un array <code>int</code> di dimensione 5</strong>. Conserva l'indirizzo base dell'array <code>prime[5]</code>, che è uguale all'indirizzo del primo elemento. Pertanto un aumento di 1 risulta in un indirizzo con un aumento di 5 x 4 = 20 byte.</p><p>In breve, <code>arrayName</code> e <code>&amp;arrayName[0]</code> puntano all'elemento 0 mentre &nbsp;<code>&amp;arrayName</code> punta all'intero array.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/09f8f82032f04a27fce46cc048644f8d.gif" class="kg-image" alt="1-D Array" width="600" height="400" loading="lazy"></figure><p>Possiamo accedere agli elementi dell'array usando variabili indicizzate come questa:</p><pre><code class="language-c">int prime[5] = {2,3,5,7,11};
for( int i = 0; i &lt; 5; i++)
{
  printf("indice = %d, indirizzo = %d, valore = %d\n", i, &amp;prime[i], prime[i]);
}
</code></pre><p>Possiamo fare la stessa cosa usando i puntatori che sono <strong>sempre</strong> più veloci rispetto all'uso dell'indicizzazione.</p><pre><code class="language-c">int prime[5] = {2,3,5,7,11};
for( int i = 0; i &lt; 5; i++)
{
  printf("indice = %d, indirizzo = %d, valore = %d\n", i, prime + i, *(prime + i));
}
</code></pre><p>Entrambi i metodi danno questo risultato:</p><pre><code class="language-c">indice = 0, indirizzo = 6422016, valore = 2
indice = 1, indirizzo = 6422020, valore = 3
indice = 2, indirizzo = 6422024, valore = 5
indice = 3, indirizzo = 6422028, valore = 7
indice = 4, indirizzo = 6422032, valore = 11</code></pre><p>Quindi <code>&amp;arrayName[i]</code> e <code>arrayName[i]</code> sono lo stesso di &nbsp;<code>arrayName + i</code> e &nbsp;<code>*(arrayName + i)</code>, rispettivamente.</p><h3 id="3-array-2-d"><strong><strong>3. Array</strong> <strong>2-D</strong></strong></h3><p>Gli array bidimensionali sono array di array.</p><pre><code class="language-c">int marks[5][3] = { { 98, 76, 89},
                    { 81, 96, 79},
                    { 88, 86, 89},
                    { 97, 94, 99},
                    { 92, 81, 59}
                  };
</code></pre><p>Si può pensare a <code>marks</code> come un array di 5 elementi, ognuno dei quali è un array monodimensionale che contiene 3 interi. Lavoreremo su una serie di programmi per comprendere le diverse espressioni di indicizzazione.</p><pre><code class="language-c">printf("L'indirizzo dell'intero array 2-D = %d\n", &amp;marks);
printf("L'aggiunta di 1 risulta in %d\n", &amp;marks +1);

/* Output */
L'indirizzo dell'intero array 2-D = 6421984
L'aggiunta di 1 risulta in 6422044
</code></pre><p>Come con gli array 1-D, <code>&amp;marks</code> punta all'intero array 2-D, <code>marks[5][3]</code>. Pertanto incrementando di 1 ( = 5 array x 3 interi ciascuno x 4 &nbsp;byte = 60) risulta un aumento di 60 byte.</p><pre><code class="language-c">printf("Indirizzo dell'array 0 = %d\n", marks);
printf("L'aggiunta di 1 risulta in %d\n", marks +1);
printf("Indirizzo dell'array 0 =%d\n", &amp;marks[0]);
printf("L'aggiunta di 1 risulta in %d\n", &amp;marks[0] + 1);

/* Output */
Indirizzo dell'array 0 = 6421984
L'aggiunta di 1 risulta in 6421996
Indirizzo dell'array 0 = 6421984
L'aggiunta di 1 risulta in 6421996</code></pre><p>Se <code>marks</code> fosse un array 1-D, <code>marks</code> e <code>&amp;marks[0]</code> avrebbero puntato allo stesso elemento <code>0</code> . <strong>Per un array 2-D, gli elementi ora sono array 1-D</strong>. Di conseguenza, <code>marks</code> e <code>&amp;marks[0]</code> puntano all'elemento dell'array con indice &nbsp;<code>0</code> , e l'aggiunta di 1 punta al primo array.</p><pre><code class="language-c">printf("Indirizzo dell'elemento 0 dell'array 0 = %d\n", marks[0]);
printf("L'aggiunta di 1 risulta in %d\n", marks[0] + 1);
printf("Indirizzo dell'elemento 0 del primo array = %d\n", marks[1]);
printf("L'aggiunta di 1 risulta in %d\n", marks[1] + 1);

 /* Output */
Indirizzo dell'elemento 0 dell'array 0 = 6421984
L'aggiunta di 1 risulta in 6421988
Indirizzo dell'elemento 0 del primo array = 6421996
L'aggiunta di 1 risulta in 6422000
</code></pre><p>Ora viene la differenza. Per un array 1-D, <code>marks[0]</code> darebbe il valore dell'elemento 0. Un incremento di 1 aumenterebbe il valore di 1.</p><p>Ma in un array 2-D , <code>marks[0]</code> punta all'elemento <code>0</code> dell'array <code>0</code>. In modo simile, &nbsp;<code>marks[1]</code> punta all'elemento <code>0</code> del primo array. Un incremento di 1 punterebbe al primo elemento del primo array.</p><pre><code class="language-c">printf("Valore dell'elemento 0 dell'array 0 = %d\n", marks[0][0]);
printf("L'aggiunta di 1 risulta in %d", marks[0][0] + 1);

/* Output */
Valore dell'elemento 0 dell'array 0 = 98
L'aggiunta di 1 risulta in 99</code></pre><p>Questa è la parte nuova, &nbsp;<code>marks[i][j]</code> fornisce il valore dell'elemento <code>j</code> dell'array <code>i</code>. Un incremento a esso cambia il valore conservato in <code>marks[i][j]</code>. Ora proviamo a scrivere <code>marks[i][j]</code> in termini di puntatori.</p><p>Sappiamo dalla nostra precedente discussione che <code>marks[i] + j</code> punterebbe all'elemento <code>i</code> dell'array <code>j</code>. Dereferenziandolo significherebbe ottenere il valore a quell'indirizzo. Pertanto <strong><strong><code>marks[i][j]</code> </strong>è uguale a<strong> <code>*(marks[i] + j)</code></strong></strong>.</p><p>Dalla nostra discussione sugli array 1-D, <code>marks[i]</code> è uguale a <code>*(marks + i)</code>. Quindi <strong><strong><code>marks[i][j]</code> </strong>può essere scritto come<strong> <code>*(*(marks + i) + j)</code></strong></strong> in termini di puntatori.</p><p>Ecco un riepilogo delle notazioni a confronto per gli array monodimensionali e bidimensionali.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>ESPRESSIONE</th>
<th>ARRAY 1-D</th>
<th>ARRAY 2-D</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>&amp;arrayName</code></td>
<td>punta all'indirizzo dell'intero array<br>aggiungendo 1 l'indirizzo aumenta di 1 x sizeof(arrayName)</td>
<td>punta all'indirizzo dell'intero array<br>aggiungendo 1 l'indirizzo aumenta di 1 x sizeof(arrayName)</td>
</tr>
<tr>
<td><code>arrayName</code></td>
<td>punta all'elemento 0<br>aggiungendo 1 aumenta l'indirizzo del primo elemento</td>
<td>punta all'elemento 0 (array)<br>aggiungendo 1 aumenta l'indirizzo del primo elemento (array)</td>
</tr>
<tr>
<td><code>&amp;arrayName[i]</code></td>
<td>punta all'elemento i<br>aggiungendo 1 aumenta l'indirizzo all'elemento (i+1)</td>
<td>punta all'elemento i (array)<br>aggiungendo 1 aumenta l'indirizzo dell'elemento (i+1) (array)</td>
</tr>
<tr>
<td><code>arrayName[i]</code></td>
<td>fornisce il valore dell'elemento i<br>aggiungendo 1 aumenta dell'elemento i</td>
<td>punta all'elemento 0 dell'array i<br>aggiungento 1 aumenta l'indirizzo del primo elemento dell'array i</td>
</tr>
<tr>
<td><code>arrayName[i][j]</code></td>
<td>Nulla</td>
<td>fornisce il valore dell'elemento j dell'array i<br>aggiungendo 1 aumenta il valore dell'elemento j dell'array i</td>
</tr>
<tr>
<td>Espressione di Puntatore per Accedere agli Elementi</td>
<td><code>*( arrayName + i)</code></td>
<td><code>*( *( arrayName + i) + j)</code></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h3 id="4-stringhe"><strong><strong>4. String</strong>he</strong></h3><p>Una stringa è un array monodimensionale di caratteri che finisce con un carattere null <code>(\0)</code>. Quando scriviamo <code>char name[] = "Srijan";</code>, ciascun carattere occupa un byte di memoria con l'ultimo che è sempre <code>\0</code>.</p><p>In modo simile agli array visti in precedenza, <code>name</code> e <code>&amp;name[0]</code> puntano al carattere a indice <code>0</code> nella stringa mentre <code>&amp;name</code> punta all'intera stringa. Inoltre, &nbsp;<code>name[i]</code> può essere scritto come <code>*(name + i)</code>.</p><pre><code class="language-c">/* Array di Stringhe */
char top[6][15] = {
                    "Liverpool",
                    "Man City",
                    "Man United",
                    "Chelsea",
                    "Leicester",
                    "Tottenham"
                  };

printf("Puntatore a un array 2-D = %d\n", &amp;top);
printf("L'aggiunta di 1 risulta in %d\n", &amp;top + 1);

 /* Output */
// Puntatore a un array 2-D = 6421952
// L'aggiunta di 1 risulta in 6422042

printf("Puntatore all'indice 0 della stringa = %d\n", &amp;top[0]);
printf("L'aggiunta di 1 risulta in %d\n", &amp;top[0] + 1);

 /* Output */
// Puntatore all'indice 0 della stringa = 6421952
// L'aggiunta di 1 risulta in 6421967

printf("Puntatore all'indice 0 della stringa = %d\n", top);
printf("L'aggiunta di 1 risulta in %d\n", top + 1);

 /* Output */
// Puntatore all'indice 0 della stringa = 6421952
// L'aggiunta di 1 risulta in 6421967

printf("Puntatore all'elemento a indice 0 della quarta stringa = %d\n", top[4]);
printf("Puntatore al primo elemento della quarta stringa = %c\n", top[4] + 1);

 /* Output */
// Puntatore all'elemento a indice 0 della quarta stringa = 6422012
// Puntatore al primo elemento della quarta stringa = 6422013

printf("Valore del primo carattere della terza stringa = %c\n", top[3][1]);
printf("Lo stesso usando puntatori = %c\n", *(*(top + 3) + 1));

 /* Output */
// Valore del primo carattere della terza stringa = h
// Lo stesso usando puntatori = h
</code></pre><p>Si può accedere e manipolare anche un array di caratteri bidimensionale oppure un array di stringhe come discusso prima.</p><pre><code class="language-c">/* Array di Stringhe */
char top[6][15] = {
                    "Liverpool",
                    "Man City",
                    "Man United",
                    "Chelsea",
                    "Leicester",
                    "Tottenham"
                  };

printf("Puntatore a un array 2-D = %d\n", &amp;top);
printf("L'aggiunta di 1 risulta in %d\n", &amp;top + 1);

 /* Output */
// Puntatore a un array 2-D = 6421952
// L'aggiunta di 1 risulta in 6422042

printf("Puntatore all'indice 0 della stringa = %d\n", &amp;top[0]);
printf("L'aggiunta di 1 risulta in %d\n", &amp;top[0] + 1);

 /* Output */
// Puntatore all'indice 0 della stringa = 6421952
// L'aggiunta di 1 risulta in 6421967

printf("Puntatore all'indice 0 della stringa = %d\n", top);
printf("L'aggiunta di 1 risulta in %d\n", top + 1);

 /* Output */
// Puntatore all'indice 0 della stringa = 6421952
// L'aggiunta di 1 risulta in 6421967

printf("Puntatore all'elemento a indice 0 della quarta stringa = %d\n", top[4]);
printf("Puntatore al primo elemento della quarta stringa = %c\n", top[4] + 1);

 /* Output */
// Puntatore all'elemento a indice 0 della quarta stringa = 6422012
// Puntatore al primo elemento della quarta stringa = 6422013

printf("Valore del primo carattere della terza stringa = %c\n", top[3][1]);
printf("Lo stesso usando puntatori = %c\n", *(*(top + 3) + 1));

 /* Output */
// Valore del primo carattere della terza stringa = h
// Lo stesso usando puntatori = h
</code></pre><h3 id="5-array-di-puntatori"><strong><strong>5. Array </strong>di Puntatori</strong></h3><p>Oltre agli array di tipo &nbsp;<code>int</code> e &nbsp;<code>char</code>, esiste anche un array di puntatori. Questo tipo di array sarebbe semplicemente una collezione di indirizzi. Questi indirizzi potrebbero puntare a variabili singole oppure a un altro array.</p><p>La sintassi per dichiarare un <strong>array di puntatori </strong>è la seguente:</p><pre><code class="language-c">tipoDato *nomeVariabile[dimensione];

/* Esempi */
int *example1[5];
char *example2[8];
</code></pre><p>Seguendo la <a href="http://unixwiz.net/techtips/reading-cdecl.html">precedenza degli operatori</a>, il primo esempio potrebbe essere letto come - &nbsp;<em><em><code>example1</code> </em>è un array<em>(<code>[]</code>) </em>di 5 puntatori a<em> <code>int</code></em></em>. In modo simile, <em><em><code>example2</code> </em>è un<em> array </em>di<em> 8 </em>puntatori a<em> <code>char</code></em></em>.</p><p>Possiamo conservare un array di stringhe bidimensionale <code>top</code> usando un array di puntatori, risparmiando anche della memoria.</p><pre><code class="language-c">char *top[] = {
                    "Liverpool",
                    "Man City",
                    "Man United",
                    "Chelsea",
                    "Leicester",
                    "Tottenham"
                  };
</code></pre><p><code>top</code> conterrà gli indirizzi base di tutti i rispettivi nomi. L'indirizzo base di &nbsp;<code>"Liverpool"</code> sarà conservato in <code>top[0]</code>, <code>"Man City"</code> in <code>top[1]</code>, e così via.</p><p>Nella dichiarazione precedente, abbiamo richiesto 90 byte per conservare i nomi. Qui servono solo ( 58 (somma dei byte dei nomi) + 12 ( byte richiesti per conservare l'indirizzo nell'array) ) 70 byte.</p><p>La manipolazione di stringhe o interi diventa molto più facile quando si usa un array di puntatori.</p><p>Se proviamo a inserire <code>"Leicester"</code> davanti a <code>"Chelsea"</code>, dobbiamo solo invertire i valori di &nbsp;<code>top[3]</code> e <code>top[4]</code> in questo modo:</p><pre><code class="language-c">char *temporary;
temporary = top[3];
top[3] = top[4];
top[4] = temporary;
</code></pre><p>Senza puntatori, avremmo dovuto scambiare ogni carattere delle stringhe, il che avrebbe richiesto più tempo. Ecco perché le stringhe sono generalmente dichiarate usando i &nbsp;puntatori.</p><h3 id="6-puntatori-ad-array"><strong><strong>6. P</strong>untatori ad<strong> Array</strong></strong></h3><p>Come i puntatori a <code>int</code> o i puntatori a <code>char</code>, abbiamo anche puntatori ad array. Questo puntatore punta all'intero array invece che ai suoi elementi.</p><p>Ricordi che abbiamo discusso di come <code>&amp;arrayName</code> punti all'intero array? Ecco, si tratta di un puntatore ad array.</p><p>Un puntatore ad array può essere dichiarato in questo modo:</p><pre><code class="language-c">tipoDato (*nomeVariabile)[dimensione];

/* Esempi */
int (*ptr1)[5];
char (*ptr2)[15];
</code></pre><p>Nota le parentesi. Senza di esse, avremmo un array di puntatori. Il primo esempio può essere letto come &nbsp;- <em><em><code>ptr1</code> </em>è un puntatore a un array di<em> 5 <code>int</code></em> <em>(</em>interi<em>)</em></em>.</p><pre><code class="language-c">int goals[] = { 85,102,66,69,67};
int (*pointerToGoals)[5] = &amp;goals;
printf("Indirizzo conservato in pointerToGoals %d\n", pointerToGoals);
printf("Dereferenziandolo, otteniamo %d\n",*pointerToGoals);

/* Output */
Indirizzo conservato in pointerToGoals 6422016
Dereferenziandolo, otteniamo 6422016
</code></pre><p>Quando dereferenziamo un puntatore, otteniamo il valore a quell'indirizzo. Alla stessa stregua, dereferenziando un puntatore ad array, otteniamo l'array e il nome al quale punta l'array che punta all'indirizzo base. Possiamo confermare che <code>*pointerToGoals</code> fornisce l'array <code>goals</code> se troviamo la sua dimensione.</p><pre><code class="language-c">printf("Dimensione di goals[5] = %d, *pointerToGoals);

/* Output */
Dimensione di goals[5] = 20
</code></pre><p>Se lo dereferenziamo nuovamente, otterremo il valore conservato in quell'indirizzo. Possiamo stampare tutti gli elementi usando <code>pointerToGoals</code>.</p><pre><code class="language-c">for(int i = 0; i &lt; 5; i++)
  printf("%d ", *(*pointerToGoals + i));

/* Output */
85 102 66 69 67
</code></pre><p>I puntatori e puntatori ad array sono piuttosto utili se accoppiati a funzioni. A seguire nella prossima sezione!</p><h2 id="c-funzioni-1"><strong><strong>C. Fun</strong>z<strong>ion</strong>i</strong></h2><h3 id="1-chiamata-per-valore-vs-chiamata-per-riferimento"><strong><strong>1. C</strong>hiamata per Valore vs. Chiamata per Riferimento</strong></h3><p>Dai un'occhiata al programma qui sotto:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int multiply(int x, int y){
  int z;
  z = x * y;
  return z;
}

main(){
  int x = 3, y = 5; 
  int product = multiply(x,y);
  printf("Prodotto = %d\n", product);
  /* stampa "Prodotto = 15" */
}
</code></pre><p>La funzione <code>multiply()</code> riceve due argomenti <code>int</code> e ritorna il loro prodotto come &nbsp;<code>int</code>.</p><p>Nella chiamata a <code>multiply(x,y)</code>, passiamo i valori di <code>x</code> e <code>y</code> (assegnati in <code>main()</code>), che sono gli <em>effettivi argomenti</em>, per <code>multiply()</code>.</p><p>I valori degli effettivi argomenti sono passati o copiati negli <em>argomenti formali </em><code>x</code> e <code>y</code> ( di <code>multiply()</code>). &nbsp;<code>x</code> e <code>y</code> di <code>multiply()</code> sono diversi da quelli di <code>main()</code>. Questo si può verificare stampando i loro indirizzi.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int multiply(int x, int y){
  printf("Indirizzo di x in multiply() = %d\n", &amp;x);
  printf("Indirizzo di y in multiply() = %d\n", &amp;y);
  int z;
  z = x * y;
  return z;
}

main(){
  int x = 3, y = 5;
  printf("Indirizzo di x in main() = %d\n", &amp;x);
  printf("Indirizzo di y in main() = %d\n", &amp;y);
  int product = multiply(x,y);
  printf("Prodotto = %d\n", product);
}

/* Output */
Indirizzo di x in main() = 6422040
Indirizzo di y in main() = 6422036
Indirizzo di x in multiply() = 6422000
Indirizzo di y in multiply() = 6422008
Prodotto = 15
</code></pre><p>Visto che abbiamo creato valori conservati un una nuova posizione, ci costa memoria. Non sarebbe meglio se potessimo eseguire la stessa operazione senza sprecare spazio?</p><p>La <strong>chiamata per riferimento </strong>ci consente di farlo. Passiamo gli indirizzi o riferimenti delle variabili alla funzione, la quale non crea una copia. Usando l'operatore di dereferenziazione <code>*</code>, possiamo avere accesso al valore conservato in quegli indirizzi.</p><p>Possiamo anche riscrivere il programma qui sopra usando una chiamata per riferimento.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int multiply(int *x, int *y){
  int z;
  z = (*x) * (*y);
  return z;
}

main(){
  int x = 3, y = 5; 
  int product = multiply(&amp;x,&amp;y);
  printf("Prodotto = %d\n", product);
   /* Stampa "Prodotto = 15" */
}</code></pre><h3 id="2-puntatori-come-argomenti-di-funzione"><strong><strong>2. P</strong>untatori come Argomenti di Funzione</strong></h3><p>In questa sezione, esamineremo vari programmi nei quali passiamo valori di tipo <code>int</code>, <code>char</code>, array e stringhe come argomenti usando puntatori.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

void add(float *a, float *b){
 float c = *a + *b;
 printf("L'addizione fornisce %.2f\n",c);
}

void subtract(float *a, float *b){
 float c = *a - *b;
 printf("La sottrazione fornisce %.2f\n",c);
}

void multiply(float *a, float *b){
 float c = *a * *b;
 printf("La moltiplicazione fornisce %.2f\n",c);
}

void divide(float *a, float *b){
 float c = *a / *b;
 printf("La divisione fornisce %.2f\n",c);
}

main(){
    printf("Digita due numeri :\n");
    float a,b;
    scanf("%f %f",&amp;a,&amp;b);
    printf("Cosa vuoi fare con questi numeri?\nAggiungi : a\nSottrai : s\nMoltiplica : m\nDividi : d\n");
    char operation = '0';
    scanf(" %c",&amp;operation);
    printf("\nEseguo...\n\n");
    switch (operation) {
    case 'a':
        add(&amp;a,&amp;b);
        break;
    case 's':
        subtract(&amp;a,&amp;b);
        break;
    case 'm':
        multiply(&amp;a,&amp;b);
        break;
    case 'd':
        divide(&amp;a,&amp;b);
        break;
    default:
        printf("Input non valido!!!\n");

  }

}
</code></pre><p>Abbiamo creato quattro funzioni, &nbsp;<code>add()</code>, <code>subtract()</code>, <code>multiply()</code> e <code>divide()</code> per eseguire operazioni aritmetiche su due numeri, &nbsp;<code>a</code> e <code>b</code>.</p><p>Gli indirizzi di <code>a</code> e <code>b</code> sono passati alle funzioni. All'interno della funzione, usando &nbsp;<code>*</code> abbiamo accesso ai valori e stampiamo il risultato.</p><p>In modo simile, possiamo passare array come argomenti usando un puntatore al loro primo elemento.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

void greatestOfAll( int *p){
  int max = *p;
  for(int i=0; i &lt; 5; i++){
    if(*(p+i) &gt; max)
       max = *(p+i);
  }
  printf("L'elemento più grande è %d\n",max);
}
main(){
  int myNumbers[5] = { 34, 65, -456, 0, 3455};
  greatestOfAll(myNumbers);
   /* Stampa :L'elemento più grande è 3455" */
}
</code></pre><p>Visto che il nome dell'array è esso stesso un puntatore al primo elemento, lo passiamo come argomento alla funzione <code>greatestOfAll()</code>. Nella funzione qui sopra, iteriamo attraverso l'array tramite un ciclo e un puntatore.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

void wish(char *p){
 printf("Buona giornata, %s",p);
}

main(){
 printf("Digita il tuo nome : \n");
 char name[20];
 gets(name);
 wish(name);
}
</code></pre><p>Qui sopra passiamo la stringa <code>name</code> a <code>wish()</code> tramite un puntatore e stampiamo il messaggio.</p><h3 id="3-puntatori-come-valori-di-ritorno-da-funzione"><strong><strong>3. P</strong>untatori come Valori di Ritorno da Funzione</strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt;

int* multiply(int *a, int *b){
  int c = *a * *b;
  return &amp;c;
}

main(){
  int a= 3, b = 5;
  int *c = multiply (&amp;a,&amp;b);
  printf("Prodotto = %d",*c);
}
</code></pre><p>La funzione <code>multiply()</code> riceve due parametri a &nbsp;<code>int</code>. Anch'essa ritorna un puntatore a &nbsp;<code>int</code> che conserva l'indirizzo nel quale il prodotto viene salvato.</p><p>È molto facile pensare che il risultato sia 15. Ma non lo è!</p><p>Quando viene chiamata <code>multiply()</code>, l'esecuzione di &nbsp;<code>main()</code> viene messa in pausa e ora la memoria viene allocata per l'esecuzione di <code>multiply()</code>. Dopo che l'esecuzione è completata, la memoria allocata a &nbsp;<code>multiply()</code> viene deallocata.</p><p>Pertanto, sebbene <code>c</code> ( locale a <code>main()</code>) conservi l'indirizzo del prodotto, <strong>non c'è garanzia</strong> che il dato sia ancora presente visto che la memoria è stata deallocata.</p><p>Quindi significa che i puntatori non possono essere ritornati da una funzione? No!</p><p>Possiamo fare due cose. Conservare l'indirizzo nello <a href="https://it.wikipedia.org/wiki/Gestione_della_memoria">heap</a> o sezione globale oppure dichiarare la variabile statica (<code>static</code>) in modo che il suo valore persista.</p><p>Le variabili statiche possono essere create semplicemente usando la <em>parola chiave</em> <code>static</code> prima del tipo di dato in fase di dichiarazione della variabile.</p><p>Per conservare indirizzi nello heap, possiamo usare le funzioni di libreria <code>malloc()</code> e <code>calloc()</code> che allocano memoria dinamicamente.</p><p>Il programma seguente spiega entrambi i metodi, che ritornano il risultato di 15.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/* Usando malloc() */

int* multiply(int *a, int *b){
  int *c = malloc(sizeof(int));
  *c = *a * *b;
  return c;
}

main(){
  int a= 3, b = 5;
  int *c = multiply (&amp;a,&amp;b);
  printf("Prodotto = %d",*c);
}

/* Usando la parola chiave static */
#include &lt;stdio.h&gt;

int* multiply(int *a, int *b){
  static int c;
  c = *a * *b;
  return &amp;c;
}

main(){
  int a= 3, b = 5;
  int *c = multiply (&amp;a,&amp;b);
  printf("Prodotto = %d",*c);
}
</code></pre><h3 id="4-puntatore-a-funzione"><strong><strong>4. </strong>Puntatore a Funzione</strong></h3><p>Come un puntatore a diversi tipi di dati, abbiamo anche un puntatore a funzione.</p><p>Un puntatore a funzione (<strong><strong>function pointer</strong>)</strong> conserva l'indirizzo di una funzione. Tuttavia non punta ad alcun dato. Punta alla prima istruzione nella funzione.</p><p>La sintassi per dichiarare un puntatore a funzione è la seguente:</p><pre><code class="language-c"> /* Dichiarazione di un funzione */
tipoRitornato nomeFunzione(tipoParametro1, tipoParametro2, ...);

 /* Dichiarazione di un puntatore a funzione */
tipoRitornato (*nomePuntatore)(tipoParametro1, tipoParametro2, ...);
nomePuntatore = &amp;nomeFunzione; /* oppure nomePuntatore = nomefunzione; */
</code></pre><p>L'esempio che segue chiarisce:</p><pre><code class="language-c">int* multiply(int *a, int *b)
{
    int *c = malloc(sizeof(int));
    *c = *a * *b;
    return c;
}

main()
{ 
    int a=3,b=5;
    int* (*p)(int*, int*) = &amp;multiply; /* oppure int* (*p)(int*, int*) = multiply; */
    int *c = (*p)(&amp;a,&amp;b); /* oppure int *c = p(&amp;a,&amp;b); */
    printf("Prodotto = %d",*c);
}
</code></pre><p>La dichiarazione per il puntatore &nbsp;<code>p</code> alla funzione <code>multiply()</code> può essere letto come (seguendo la <a href="http://unixwiz.net/techtips/reading-cdecl.html">precedenza degli operatori</a>) - <em><em><code>p</code> </em>è un puntatore a funzione con due puntatori di tipo <em> <code>int</code>( o</em>ppure due puntatori a<em> <code>int</code>) </em>come parametri che ritorna un puntatore a <em> <code>int</code></em></em>.</p><p>Visto che il nome della funzione è anche un puntatore alla funzione, l'uso di <code>&amp;</code> non è necessario. Inoltre l'eliminazione di <code>*</code> dalla chiamata alla funzione non influisce sul programma.</p><h3 id="5-array-di-puntatori-a-funzioni"><strong><strong>5. Arra</strong>y di Puntatori a Funzioni</strong></h3><p>Abbiamo visto come creare un array di puntatori a &nbsp;<code>int</code>, <code>char</code>, e così via. Allo stesso modo, possiamo creare un array di puntatori a funzione.</p><p>In questo array, ogni elemento conserverà un indirizzo di una funzione, dove tutte le funzioni sono dello stesso tipo. Vale a dire che hanno lo stesso numero di parametri e tipo dato di ritorno.</p><p>Andremo a modificare un programma che abbiamo esaminato in precedenza in questa sezione. Conserveremo gli indirizzi di <code>add()</code>, <code>subtract()</code>, <code>multiply()</code> e <code>divide()</code> in un array facendo una chiamata a funzione tramite indicizzazione.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

void add(float *a, float *b){
 float c = *a + *b;
 printf("L'addizione fornisce %.2f\n",c);
}

void subtract(float *a, float *b){
 float c = *a - *b;
 printf("La sottrazione fornisce %.2f\n",c);
}

void multiply(float *a, float *b){
 float c = *a * *b;
 printf("La moltiplicazione fornisce %.2f\n",c);
}

void divide(float *a, float *b){
 float c = *a / *b;
 printf("La divisione fornisce %.2f\n",c);
}

main(){
    printf("Digita due numeri :\n");
    float a,b;
    scanf("%f %f",&amp;a,&amp;b);
    printf("Cosa vuoi fare con questi numeri?\nAggiungi : a\nSottrai : s\nMoltiplica : m\nDividi : d\n");
    char operation = '0';
    scanf(" %c",&amp;operation);
    void (*p[])(float* , float*) = {add,subtract,multiply,divide};
    printf("\nEseguo...\n\n");
    switch (operation) {
    case 'a':
        p[0](&amp;a,&amp;b);
        break;
    case 's':
        p[1](&amp;a,&amp;b);
        break;
    case 'm':
        p[2](&amp;a,&amp;b);
        break;
    case 'd':
        p[3](&amp;a,&amp;b);
        break;
    default:
        printf("Input non valido!!!\n");

  }

}
</code></pre><p>Qui la dichiarazione può essere letta come - <em><em><code>p</code> </em>è un array di puntatori a funzione con due puntatori <em><code>float</code> </em>come parametri e valore di ritorno <em><code>void</code></em></em>.</p><h3 id="6-puntatore-a-funzione-come-argomento"><strong><strong>6. P</strong>untatore a Funzione come Argomento</strong></h3><p>Come qualsiasi altro puntatore, i puntatori a funzione possono anche essere passati a un'altra funzione, nota come <strong>funzione <strong>callback</strong></strong>. La funzione dalla quale viene passata è nota come <strong>funzione chiamante</strong>.</p><p>Un modo migliore per capire sarebbe dare uno sguardo a <code>qsort()</code>, che è una funzione integrata in C. Viene usata per ordinare un array di interi, stringhe, strutture e così via. La dichiarazione per <code>qsort()</code> è:</p><pre><code class="language-c">void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
</code></pre><p><code>qsort()</code> riceve quattro argomenti:</p><ol><li>un puntatore <code>void</code> verso l'inizio dell'array da ordinare</li><li>il numero di elementi</li><li>la dimensione di ciascun elemento</li><li>un puntatore a funzione che riceve due puntatori <code>void</code> come argomenti e ritorna un <code>int</code></li></ol><p>Il puntatore a funzione punta a una <em>funzione di confronto</em> che ritorna un intero maggiore di zero se il primo argomento è maggiore del secondo, un intero minore di zero se il secondo argomento è maggiore del primo e zero se sono uguali.</p><p>Il programma seguente mostra il suo utilizzo:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int compareIntegers(const void *a, const void *b)
{
  const int *x = a;
  const int *y = b;
  return *x - *y;
}

main(){

  int myArray[] = {97,59,2,83,19,97};
  int numberOfElements = sizeof(myArray) / sizeof(int);

  printf("Prima dell'ordinamento - \n");
  for(int i = 0; i &lt; numberOfElements; i++)
   printf("%d ", *(myArray + i));

  qsort(myArray, numberOfElements, sizeof(int), compareIntegers);

  printf("\n\nDopo l'ordinamento - \n");
  for(int i = 0; i &lt; numberOfElements; i++)
    printf("%d ", *(myArray + i));
 }

/* Output */

Prima dell'ordinamento -
97 59 2 83 19 97

Dopo l'ordinamento -
2 19 59 83 97 97
</code></pre><p>Visto che il nome di una funzione è esso stesso un puntatore, possiamo passare <code>compareIntegers</code> come quarto argomento.</p><h2 id="d-strutture-1"><strong><strong>D. Stru</strong>t<strong>ture</strong></strong></h2><h3 id="1-puntatore-a-struttura"><strong><strong>1. P</strong>untatore a Struttura</strong></h3><p>Come i puntatori a intero, ad array e a funzione, abbiamo anche puntatori a struttura.</p><pre><code class="language-c">struct records {
    char name[20];
    int roll;
    int marks[5];
    char gender;
};

struct records student = {"Alex", 43, {76, 98, 68, 87, 93}, 'M'};

struct records *ptrStudent = &amp;student;
</code></pre><p>Qui abbiamo dichiarato un puntatore <code>ptrStudent</code> di tipo <code>struct records</code> e abbiamo assegnato l'indirizzo di <code>student</code> a <code>ptrStudent</code>.</p><p><code>ptrStudent</code> conserva l'indirizzo base di &nbsp;<code>student</code>, che è l'indirizzo base del primo membro della struttura. Incrementando di 1 si incrementerebbe l'indirizzo di <code>sizeof(student)</code> byte.</p><pre><code class="language-c">printf("Indirizzo della struttura = %d\n", ptrStudent);
printf("Indirizzo del membro `name` = %d\n", &amp;student.name);
printf("L'incremento di 1 risulta in %d\n", ptrStudent + 1);

/* Output */
Indirizzo della struttura = 6421984
Indirizzo del membro `name` = 6421984
L'incremento di 1 risulta in 6422032
</code></pre><p>Possiamo accedere ai membri di <code>student</code> usando <code>ptrStudent</code> in due modi: con il nostro vecchio amico<code>*</code> oppure usando <code>-&gt;</code> ( <strong><strong>infix o</strong>ppure<strong> operator</strong>e freccia</strong>).</p><p>Con <code>*</code>, continueremo a usare <code>.</code>(operatore punto) laddove con <code>-&gt;</code> non avremo bisogno dell'operatore punto.</p><pre><code class="language-c">printf("Nome senza usare ptrStudent : %s\n", student.name);
printf("Nome usando ptrStudent e * : %s\n", ( *ptrStudent).name);
printf("Nome usando ptrStudent e -&gt; : %s\n", ptrStudent-&gt;name);

/* Output */
Nome senza usare ptrStudent: Alex
Nome usando ptrStudent e *: Alex
Nome usando ptrStudent e -&gt;: Alex
</code></pre><p>Allo stesso modo possiamo accedere e modificare anche altri membri. Nota che le parentesi sono necessarie quando si usa <code>*</code> visto che l'operatore punto (<code>.</code>) ha maggiore precedenza rispetto a <code>*</code>.</p><h3 id="2-array-di-strutture"><strong><strong>2. Array </strong>di<strong> Stru</strong>t<strong>ture</strong></strong></h3><p>Possiamo creare un array di tipo <code>struct records</code> e usare un puntatore per accedere agli elementi e ai loro membri.</p><pre><code class="language-c">struct records students[10];

 /* Puntatore al primo elemento (struttura) dell'array */
struct records *ptrStudents1 = &amp;students;

 /* Puntatore a un array di 10 struct records */
struct records (*ptrStudents2)[10] = &amp;students;
</code></pre><p>Nota che <code>ptrStudent1</code> è un puntatore a <code>student[0]</code> laddove <code>ptrStudent2</code> è un puntatore all'intero array di 10 <code>struct records</code>. Aggiungendo 1 a <code>ptrStudent1</code> punterebbe a <code>student[1]</code>.</p><p>Possiamo usare <code>ptrStudent1</code> con un ciclo per iterare sugli elementi e i loro membri.</p><pre><code class="language-c">
for( int i = 0; i &lt;  10; i++)
  printf("%s, %d\n", ( ptrStudents1 + i)-&gt;name, ( ptrStudents1 + i)-&gt;roll);
</code></pre><h3 id="3-puntatore-a-struttura-come-argomento"><strong><strong>3. P</strong>untatore<strong> </strong>a<strong> Stru</strong>t<strong>tur</strong>a come Argomento</strong></h3><p>Possiamo anche passare l'indirizzo di una variabile di tipo struttura a una funzione.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

struct records {
    char name[20];
    int roll;
    int marks[5];
    char gender;
};

main(){
 struct records students = {"Alex", 43, {76, 98, 68, 87, 93}, 
'M'};
 printRecords(&amp;students);
}

void printRecords( struct records *ptr){
  printf("Name: %s\n", ptr-&gt;name);
  printf("Roll: %d\n", ptr-&gt;roll);
  printf("Gender: %c\n", ptr-&gt;gender);
  for( int i = 0; i &lt; 5; i++)
   printf("Marks in %dth subject: %d\n", i, ptr-&gt;marks[i]);
}

 /* Output */
Name: Alex
Roll: 43
Gender: M
Marks in 0th subject: 76
Marks in 1th subject: 98
Marks in 2th subject: 68
Marks in 3th subject: 87
Marks in 4th subject: 93
</code></pre><p>Nota che la struttura <code>struct records</code> viene dichiarata all'esterno di <code>main()</code>. Questo per assicurarsi che sia disponibile globalmente e possa essere usata da <code>printRecords()</code>.</p><p>Se la struttura venisse definita all'interno di <code>main()</code>, il suo ambito sarebbe limitato a <code>main()</code>. Inoltre una struttura <strong>deve</strong> essere dichiarata prima della dichiarazione della funzione.</p><blockquote>Come per le strutture, possiamo avere puntatori a union e possiamo accedere ai membri tramite l'operatore freccia(<code>-&gt;</code>).</blockquote><!--kg-card-begin: markdown--><p><a name="puntatore-a-puntatore"></a></p>
<h2 id="epuntatoreapuntatore">E. Puntatore a Puntatore</h2>
<!--kg-card-end: markdown--><p>Finora abbiamo esaminato puntatori per diversi tipi di dato, array, stringhe, funzioni, strutture e unioni.</p><p>La domanda che sorge spontanea è - ma un puntatore a puntatore?</p><p>Ho buone notizie per te! Esistono anche quelli.</p><pre><code class="language-c">int var = 6;
int *ptr_var = &amp;var;

printf("Indirizzo di var = %d\n", ptr_var);
printf("Indirizzo di ptr_var = %d\n", &amp;ptr_var);

/* Output */
Indirizzo di var = 6422036
Indirizzo di ptr_var = 6422024
</code></pre><p>Per conservare l'indirizzo della variabile <code>var</code> di tipo <code>int</code>, abbiamo un puntatore a &nbsp;<code>int</code> <code>ptr_var</code>. Avremmo bisogno di un altro puntatore per conservare l'indirizzo di <code>ptr_var</code>.</p><p>Visto che <code>ptr_var</code> è di tipo <code>int *</code>, per conservare il suo indirizzo avremmo dovuto creare un puntatore a <code>int *</code>. Il codice che segue mostra come deve essere fatto.</p><pre><code class="language-c">int * *ptr_ptrvar = &amp;ptr_var; /* oppure int* *ppvar oppure int **ppvar */
</code></pre><p>Possiamo usare <code>ptr_ptrvar</code> per accedere all'indirizzo di <code>ptr_var</code> e usare la doppia dereferenziazione per accedere al valore di <code>var</code>.</p><pre><code class="language-c">printf("Indirizzo di ptr_var = %d\n", ptr_ptrvar);
printf("Indirizzo di var = %d\n", *ptr_ptrvar);
printf("Valore di var = %d\n", *(*ptr_ptrvar));

/* Output */
Indirizzo di ptr_var = 6422024
Indirizzo di var = 6422036
Valore di var = 6
</code></pre><p>Non sono richieste le parentesi quando si dereferenzia <code>ptr_ptrvar</code>, ma è buona pratica usarle. Possiamo creare un altro puntatore a <code>ptr_ptrptrvar</code>, che conserverà l'indirizzo di <code>ptr_ptrvar</code>.</p><p>Visto che <code>ptr_ptrvar</code> è di tipo <code>int**</code>, la dichiarazione di <code>ptr_ptrptrvar</code> sarà:</p><pre><code class="language-c">int** *ptr_ptrptrvar = &amp;ptr_ptrvar;
</code></pre><p>Possiamo ancora accedere a &nbsp;<code>ptr_ptrvar</code>, <code>ptr_var</code> e <code>var</code> usando <code>ptr_ptrptrvar</code>.</p><pre><code class="language-c">printf("Indirizzo di ptr_ptrvar = %d\n", ptr_ptrptrvar);
printf("Valore per ptr_ptrvar = %d\n",*ptr_ptrptrvar);
printf("Indirizzo di ptr_var = %d\n", *ptr_ptrptrvar);
printf("Valore per ptr_var = %d\n", *(*ptr_ptrptrvar));
printf("Indirizzo di var = %d\n", *(*ptr_ptrptrvar));
printf("Valore per var = %d\n", *(*(*ptr_ptrptrvar)));

/* Output */
Indirizzo di ptr_ptrvar = 6422016
Valore per ptr_ptrvar = 6422024
Indirizzo di ptr_var = 6422024
Valore per ptr_var = 6422036
Indirizzo di var = 6422036
Valore per var = 6
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/1534533aefc96880ba542070037d147b.gif" class="kg-image" alt="Pointer to Pointer" width="600" height="400" loading="lazy"></figure><p>Se modifichiamo il valore di un qualsiasi puntatore usando <code>ptr_ptrptrvar</code> oppure <code>ptr_ptrvar</code>, il puntatore non punterebbe più alla variabile.</p><!--kg-card-begin: markdown--><p><a name="conclusione"></a></p>
<h2 id="fconclusione">F. Conclusione</h2>
<!--kg-card-end: markdown--><p>Bene! Sì, abbiamo finito. Siamo partiti dai puntatori e abbiamo finito con i puntatori (per così dire). Non dicono che la <em>curva di apprendimento è un cerchio?</em></p><p>Cerca di ricapitolare tutti i sotto argomenti che hai letto. Se li ricordi, ben fatto! Rileggi quelli che non riesci a ricordare.</p><p>Questo articolo è terminato, ma non dovresti smettere con i puntatori, fai esperimenti. Successivamente, potresti dare un'occhiata alla <em>Allocazione dinamica della memoria (<em>Dynamic Memory Allocation</em>)</em> per conoscere meglio i puntatori<em><em>.</em></em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ L'Ambito di una Variabile in C – Ambito Locale e Globale Spiegato ]]>
                </title>
                <description>
                    <![CDATA[ Nella programmazione, dovrai spesso avere a che fare con l'ambito di una variabile. L'ambito di una variabile determina se è possibile o meno accedervi e modificarla all'interno di un blocco specifico di codice. In questo tutorial, imparerai l'ambito di una variabile nel linguaggio di programmazione C. Vedrai alcuni esempi di ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/lambito-di-una-variabile-in-c/</link>
                <guid isPermaLink="false">643d4d1388ecf5067c89171b</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 15 May 2023 17:08:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/ambitodiunavariabileinc.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/scope-of-variables-in-c-local-and-global-scope-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Variable Scope in C – Local and Global Scope Explained</a>
      </p><p>Nella programmazione, dovrai spesso avere a che fare con l'ambito di una variabile. L'ambito di una variabile determina se è possibile o meno accedervi e modificarla all'interno di un blocco specifico di codice.</p><p>In questo tutorial, imparerai l'ambito di una variabile nel linguaggio di programmazione C. Vedrai alcuni esempi di codice per aiutarti a comprendere le differenze tra variabili locali e globali.</p><h2 id="cos-l-ambito-di-una-variabile">Cos'è l'ambito di una variabile<strong>?</strong></h2><p>Prima di proseguire per conoscere l'ambito locale e globale di una variabile, capiamo cosa significa <em>ambito.</em></p><blockquote><em>In termini semplici, l'ambito di una variabile è il suo</em> tempo di vita nel programma.</blockquote><p>Questo vuol dire che l'ambito di una variabile è il blocco di codice all'interno dell'intero programma dove la variabile è stata dichiarata, usata e può essere modificata.</p><p>Nella sezione successiva, imparerai cos'è l'ambito locale delle variabili.</p><h2 id="ambito-locale-delle-variabili-in-c-blocchi-annidati">Ambito Locale delle Variabili in C – Blocchi Annidati</h2><p>In questa sezione, imparerai come funzionano le variabili locali in C. Prima scriveremo del codice per un paio di esempi, quindi generalizzeremo il principio di ambito.</p><p>▶ Ecco il primo esempio:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() 
{
    int my_num = 7;
    {
        //aggiunge 10 a my_num
        my_num = my_num +10;
        //oppure più brevemente my_num +=10
        printf("my_num è %d",my_num);
    }
    
    return 0;
}
</code></pre><p>Cerchiamo di capire cosa fa il programma qui sopra:</p><p>In C, un blocco di codice è delimitato da parentesi graffe: <code>{}</code>. Le parentesi graffe di apertura e chiusura indicano rispettivamente l'inizio e la fine di un blocco.</p><ul><li>La funzione <code>main()</code> ha una variabile di tipo intero <code>my_num</code> che viene inizializzata con il valore 7 nel blocco <em>più esterno</em>. </li><li>C'è un blocco <em>più interno</em> che cerca di aggiungere 10 alla variabile <code>my_num</code>.</li></ul><p>Ora, compilando ed eseguendo il programma qui sopra, si ottiene il risultato:</p><pre><code>//Output

my_num è 17</code></pre><p>Puoi notare quanto segue:</p><ul><li>Il blocco più interno è in grado di accedere al valore di <code>my_num</code> che è stato dichiarato nel blocco più esterno e modificarlo aggiungendo 7 al valore contenuto.</li><li>Il valore di <code>my_num</code> ora è 17, come indicato nel risultato.</li></ul><h2 id="ambito-locale-delle-variabili-in-c-blocchi-annidati-esempio-2">Ambito Locale delle Variabili in C – Blocchi Annidati Esempio 2</h2><p>▶ Ecco un altro esempio sull'argomento:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() 
{
    int my_num = 7;
    {
        int new_num = 10;
    } 
    printf("new_num è %d",new_num); //questa è la riga 9
    return 0;
}</code></pre><ul><li>In questo programma, la funzione <code>main()</code> ha una variabile di tipo intero <code>my_num</code> nel blocco <em>più esterno</em>.</li><li>Un'altra variabile, <code>new_num</code> viene inizializzata nel blocco <em>più interno</em>, che è annidato nel blocco <em>più esterno</em>.</li><li>Stiamo cercando di accedere e stampare il valore della variabile del blocco <em>più interno</em> <code>new_num</code> dal blocco <em>più esterno</em>.</li></ul><p>Se cerchi di compilare il codice qui sopra, noterai che la compilazione non va a buon fine, e otterrai il seguente errore, il cui messaggio tradotto è "<code>errore: 'new_num' non dichiarata, (usata per la prima volta in questa funzione)</code>":</p><pre><code>Line   Message
9      error: 'new_num' undeclared (first use in this function)</code></pre><blockquote>Questo perché la variabile <code>new_num</code> è stata dichiarata nel blocco più interno e il suo ambito è limitato al suddetto blocco. In altre parole, è locale rispetto al blocco più interno e non può essere utilizzata nel blocco più esterno.</blockquote><p>In base alle osservazioni qui sopra, scriviamo il seguente principio generico per l'ambito locale delle variabili:</p><pre><code class="language-C">{
    /BLOCCO PIU' ESTERNO/
    
      {
        
        
        //Il contenuto del blocco più esterno che si trova immediatamente prima dell'inizio di questo blocco
        //è ACCESSIBILE qui
        
        /BLOCCO PIU' INTERNO/
        
        
      }
     
       //Il contenuto del blocco più interno NON è accessibile qui
 }
</code></pre><h2 id="ambito-locale-delle-variabili-in-c-blocchi-diversi">Ambito Locale delle Variabili in C – Blocchi Diversi</h2><p>Nell'esempio precedente, hai imparato che l'accesso da un blocco più esterno alle variabili annidate in un blocco più interno non è consentito.</p><p>In questa sezione, imparerai circa l'ambito locale di variabili dichiarate in blocchi diversi.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int my_num = 7;
    printf("%d",my_num);
    my_func();
    return 0;
}

void my_func()
{
    printf("%d",my_num);
}</code></pre><p>Nell'esempio qui sopra:</p><ul><li>La variabile di tipo intero <code>my_num</code> è dichiarata all'interno della funzione <code>main()</code>.</li><li>All'interno della funzione <code>main()</code>, il valore di <code>my_num</code> viene stampato.</li><li>C'è un'altra funzione, <code>my_func(),</code> che cerca di accedere e stampare il valore di <code>my_num</code>.</li><li>Quando inizia l'esecuzione del programma con la funzione <code>main()</code>, c'è una chiamata a <code>my_func()</code> all'interno della funzione <code>main()</code>.</li></ul><p>▶ Ora compila ed esegui il programma qui sopra. Otterrai il messaggio di errore qui sotto (traduzione: "<code>errore 'my_num' non dichiarata (primo uso in questa funzione)</code>):</p><pre><code>Line   Message
13     error: 'my_num' undeclared (first use in this function)</code></pre><p>Se noti, nella riga 13, la funzione <code>my_func()</code> tenta di accedere alla variabile <code>my_num</code> che è stata dichiarata e inizializzata all'interno della funzione <code>main()</code>.</p><blockquote>Pertanto l'ambito della variabile <code>my_num</code> è confinato alla funzione <code>main()</code>, e si dice che è locale alla funzione <code>main()</code>.</blockquote><p>Possiamo rappresentare genericamente questa nozione di ambito locale come segue:</p><pre><code class="language-C">{

    /BLOCCO 1/
    // da qui non si può accedere al contenuto del BLOCCO 2
    
}


{

    /BLOCCO 2/
    // da qui non si può accedere al contenuto del BLOCCO 1
    
} 
</code></pre><h2 id="ambito-globale-delle-variabili-in-c">Ambito Globale delle Variabili in C</h2><p>Finora, hai imparato a conoscere l'ambito locale delle variabili C. In questa sezione imparerai come dichiarare variabili globali in C.</p><p>▶ Iniziamo con un esempio.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
int my_num = 7;

int main()
{
    printf("si può accedere a my_num da main() e il suo valore è %d\n",my_num);
    //chiama my_func
    my_func();
    return 0;
}

void my_func()
{
  printf("si può accedere a my_num anche da my_func() e il suo valore è %d\n",my_num);
} 
</code></pre><p>Nell'esempio qui sopra:</p><ul><li>La variabile <code>my_num</code> è dichiarata al di fuori delle funzioni <code>main()</code> e <code>my_func()</code>.</li><li>Cerchiamo di accedere a <code>my_num</code> all'interno della funzione <code>main()</code> e ne stampiamo il valore.</li><li>Chiamiamo la funzione <code>my_func()</code> all'interno della funzione <code>main()</code>.</li><li>La funzione <code>my_func()</code> cerca anche di accedere al valore di <code>my_num</code> per stamparlo.</li></ul><p>Questo programma si compila senza errori e il risultato è mostrato qui sotto:</p><pre><code>//Output
si può accedere a my_num da main() e il suo valore è 7
si può accedere a my_num anche da my_func() e il suo valore è 7</code></pre><p>In questo esempio, ci sono due funzioni &nbsp;– &nbsp;<code>main()</code> e <code>my_func()</code>.</p><p>Tuttavia la variabile <code>my_num</code> <em>non è locale</em> ad alcuna funzione nel programma. Una variabile di questo tipo, <em>non locale</em> ad alcuna funzione, ma si dice che ha un <em>ambito globale</em> e viene chiamata variabile <em>globale.</em></p><p>Questo principio di ambito globale delle variabili può essere riepilogato come segue:</p><pre><code class="language-C">//tutte le variabili globali sono dichiarate qui
function1()
    {
    
    // è possibile accedere a tutte le variabili globali dall'interno di function1
    
    }
function2()
    {
    
    // è possibile accedere a tutte le variabili globali dall'interno di function2
     
    } 
</code></pre><h2 id="riepilogo"><strong>Riepilogo</strong></h2><p>In questo tutorial, hai imparato la differenza tra ambito locale e globale. Questo è un tutorial di livello introduttivo sull'ambito delle variabili in C.</p><p>In C, esistono modificatori di accesso per controllare il livello di accessibilità di cui una variabile dispone. Puoi modificare la modalità di accesso usando le parole chiave corrispondenti quando dichiari le variabili.</p><p>Ci vediamo al prossimo tutorial. Fino ad allora, buona programmazione!<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Istruzioni break e continue in C – Istruzioni di controllo dei loop in C ]]>
                </title>
                <description>
                    <![CDATA[ Utilizzando il linguaggio di programmazione C, può capitarti di voler cambiare il comportamento di un loop, e le istruzioni continue e break ti aiutano a saltare iterazioni e uscire dal loop in determinate condizioni. In questo tutorial, imparerai come alterare le strutture di controllo di un programma con le istruzioni ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/istruzioni-break-e-continue-in-c-istruzioni-di-controllo-dei-loop-in-c/</link>
                <guid isPermaLink="false">6343f003bd463a0650bc5a5e</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Wed, 19 Oct 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/10/markus-spiske-C0koz3G1I4I-unsplash--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/c-break-and-continue-statements-loop-control-statements-in-c-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">C Break and Continue Statements – Loop Control Statements in C Explained</a>
      </p><p>Utilizzando il linguaggio di programmazione C, può capitarti di voler cambiare il comportamento di un loop, e le istruzioni <code>continue</code> e <code>break</code> ti aiutano a saltare iterazioni e uscire dal loop in determinate condizioni.</p><p>In questo tutorial, imparerai come alterare le strutture di controllo di un programma con le istruzioni <code>break</code> e <code>continue</code>.</p><p>Iniziamo.</p><h2 id="come-usare-break-per-uscire-da-un-loop-in-c"><strong>Come usare <code>break</code> per uscire da un loop in C</strong></h2><p>In C, se vuoi uscire da un loop quando si verifica una condizione specifica, puoi usare l'istruzione <code>break</code>.</p><p>Come tutte le istruzioni in C, anche l'istruzione <code>break</code> deve terminare con un punto e virgola (<code>;</code>).</p><p>Prendiamo un esempio per capire come funziona.</p><p>Considera il seguente snippet di codice.</p><pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
    int conteggio = 0;
    while(conteggio &lt; 100)
    {
        printf("Il valore del conteggio è %d \n", conteggio);
        conteggio++;
    }
    return 0;
}</code></pre><p>In questo esempio, il loop <code>while</code> ripete le istruzioni nel corpo del loop finché <code>conteggio</code> è minore di 100.</p><p>Il conteggio parte da 0 e aumenta di 1 a ogni iterazione.</p><p>Questo è il flusso normale della struttura di controllo.</p><p>Modifichiamolo un po'.</p><ul><li>Prendiamo un intero <code>num_prefe</code> dall'utente. Ipotizziamo che <code>num_prefe</code> sia il numero preferito dell'utente nell'insieme <code>{0, 1, 2, ..., 99}</code>.</li><li>Durante ogni iterazione del loop, bisogna verificare se il valore attuale di <code>conteggio</code> sia uguale a <code>num_prefe</code>.</li><li>Vogliamo uscire dal loop quando <code>conteggio</code> è uguale a <code>num_prefe</code>.</li></ul><p>Come possiamo fare?</p><p>Dai un'occhiata al seguente snippet di codice:</p><pre><code class="language-c">#include&lt;stdio.h&gt;
int main()
{
    // Prende come input il numero preferito dell'utente
    int num_prefe;
    printf("Inserisci il tuo numero preferito da 0 a 99: ");
    scanf("%d", &amp;num_prefe);
    
    int conteggio = 0;
    while(conteggio &lt; 100)
    {
        printf("\nIl valore del conteggio è %d.", conteggio);
        if (conteggio == num_prefe)
    		break;
        conteggio++;
    }
    return 0;
}</code></pre><ul><li>Durante ogni iterazione, usiamo <code>if (conteggio == num_prefe)</code> per controllare se <code>conteggio</code> è uguale a <code>num_prefe</code>. &nbsp;Abbiamo aggiunto un'istruzione <code>break;</code> al corpo dell'istruzione <code>if</code>.</li><li>Finché <code>conteggio ≠<strong><strong> </strong></strong>num_prefe</code>, l'istruzione <code>break;</code> non viene mai raggiunta.</li><li>Quando <code>conteggio</code> è uguale a <code>num_prefe</code>, l'istruzione <code>break;</code> viene attivata e usciamo dal loop.</li><li>Il controllo adesso raggiunge la prima istruzione fuori dal loop.</li></ul><p>Qui sotto puoi vedere un output di esempio:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/10/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"></figure><p>Nota che usciamo dal loop una volta che il conteggio raggiunge <code>3</code>, che in questo caso è <code>num_prefe</code>.</p><p>Nella prossima sezione, vedremo un altro esempio per consolidare questo concetto.</p><h3 id="esempio-di-istruzione-break-in-c"><strong>Esempio di istruzione <code>break</code> in C</strong></h3><p>▶ Considera il seguente esempio:</p><ul><li><code>A[10]</code> è un array di 10 interi ed è inizializzato con degli zeri.</li><li>Vogliamo prendere gli elementi dell'array <code>A</code> da un utente e calcolare la somma degli elementi nell'array.</li><li>Tuttavia, vogliamo che ogni elemento di <code>A</code> non sia più grande di <code>20</code>.</li><li>Una volta che l'utente inserisce un numero maggiore di 20, vogliamo terminare il loop. È qui che l'istruzione <code>break;</code> torna utile.</li></ul><p>Guarda il seguente snippet di codice, che fa esattamente questo.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int A[10] = {0};
    int somma = 0;
    
    for(int i = 0; i &lt; 10; i++)
    {
        printf("Inserisci un numero: ");
        scanf("%d",&amp;A[i]);
        if (A[i] &gt; 20)
            break;
        
        somma += A[i];
    }
    printf("Somma: %d",somma);
    return 0;
}
</code></pre><ul><li><code>somma</code> è inizializzata a <code>0</code>.</li><li>In ogni passaggio del loop, l'utente deve inserire un numero, che viene aggiunto al valore corrente di <code>somma</code>.</li><li>Se l'utente inserisce un numero maggiore di 20, usciamo dal loop.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/10/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"></figure><p>Nota come il loop termina una volta che l'utente inserisce un numero maggiore di 20 – in questo caso <code>21</code>. La somma degli altri due numeri (2 e 3) viene stampata sulla console.</p><p>Se hai mai utilizzato delle istruzioni <code>switch</code> in C, è probabile che tu abbia usato l'istruzione <code>break;</code> per uscire dalla scaletta dei <code>case</code> non appena viene riscontrata una corrispondenza con l'etichetta del <code>case</code>.</p><p>In ogni caso, lo scopo di questo tutorial è mostrare il modo di utilizzare le istruzioni <code>break;</code> e <code>continue;</code> per cambiare il comportamento di un loop.</p><h2 id="come-usare-continue-per-saltare-delle-iterazioni-in-c"><strong>Come usare <code>continue</code> per saltare delle iterazioni in C</strong></h2><p>In C, se vuoi saltare delle iterazioni quando si verifica una specifica condizione, puoi usare un'istruzione <code>continue</code>.</p><blockquote>A differenza dell'istruzione <code>break</code>, l'istruzione <code>continue</code> non causa l'uscita dal loop. Invece, salta solo le iterazioni per cui la condizione è vera.</blockquote><p>Una volta che l'istruzione <code>continue;</code> viene attivata, le istruzioni nel resto del loop vengono saltate e il loop passa all'iterazione successiva.</p><h3 id="esempio-di-istruzione-continue-in-c"><strong>Esempio di istruzione <code>continue</code> in C</strong></h3><p>Usiamo l'esempio della sezione precedente, modificandolo un po'.</p><p>Diciamo che non vogliamo uscire dal loop quando l'utente inserisce un numero maggiore di 20. Piuttosto, vogliamo ignorare questi specifici input e calcolare la somma degli altri numeri nell'array <code>A</code>.</p><ul><li>Supponiamo che l'utente inserisca 10 numeri, 1 dei quali maggiore di 20.</li><li>Il nostro codice dovrebbe calcolare e mostrare la somma dei restanti 9 numeri.</li></ul><p>Come possiamo fare?</p><blockquote>Possiamo usare l'istruzione <code>continue;</code> per saltare solo le iterazioni per cui l'input dell'utente è maggiore di 20. 🙂</blockquote><p>Guarda il codice qui sotto:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int A[10] = {0};
    int somma = 0;
    
    for(int i = 0; i &lt; 10; i++)
    {
        printf("Inserisci un numero: ");
        scanf("%d",&amp;A[i]);
        if (A[i] &gt; 20)
            continue;
        
        somma += A[i];
    }
    printf("Somma: %d", somma);
    return 0;
}</code></pre><p>Nell'output puoi vedere che il primo input è <code>21</code>, che è maggiore di <code>20</code>.</p><p>Tuttavia, il loop compie dieci iterazioni. E se sei pronto un altro rapido esercizio, puoi verificare che la somma degli altri numeri (2, 3, 5, 4, 7, 15, 14, 2 e 5) fa proprio 57. ✅</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/10/image-4.png" class="kg-image" alt="image-4" width="600" height="400" loading="lazy"></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo tutorial, hai imparato come usare le istruzioni <code>break;</code> e <code>continue;</code> per controllare i loop in C.</p><p>Ricapitolando, abbiamo visto:</p><ul><li>Come uscire da un loop in base a delle condizioni specifiche con l'istruzione <code>break;</code>.</li><li>Come saltare delle iterazioni in base a delle condizioni specifiche con l'istruzione <code>continue;</code>.</li></ul><p>Spero che tu abbia trovato utile questo tutorial. Buona programmazione! 😄</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Il linguaggio di programmazione C: un tutorial per principianti ]]>
                </title>
                <description>
                    <![CDATA[ Questo tutorial ti fornirà un'ampia panoramica dei concetti di base del linguaggio di programmazione C. Parleremo della storia del linguaggio, di dove e perché viene utilizzato, del processo di compilazione e di altri fondamentali concetti di programmazione, comuni alla maggior parte dei linguaggi di programmazione più popolari. Questa non è ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/il-linguaggio-di-programmazione-c-un-tutorial-per-principianti/</link>
                <guid isPermaLink="false">62cec764b6e07a06df858b7e</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Fri, 26 Aug 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/07/c-language-image.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/what-is-the-c-programming-language-beginner-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is The C Programming Language? A Tutorial for Beginners</a>
      </p><p>Questo tutorial ti fornirà un'ampia panoramica dei concetti di base del linguaggio di programmazione C.</p><p>Parleremo della storia del linguaggio, di dove e perché viene utilizzato, del processo di compilazione e di altri fondamentali concetti di programmazione, comuni alla maggior parte dei linguaggi di programmazione più popolari.</p><p>Questa non è una guida completa al linguaggio, ma piuttosto ti permetterà di raggiungere una buona comprensione dei concetti importanti di C partendo dal livello di un principiante assoluto. </p><p>Ogni linguaggio possiede la propria sintassi e dei modi specifici di fare le cose, ma i concetti che tratteremo qui sono comuni e applicati a tutti i linguaggi di programmazione.</p><p>Comprendere il funzionamento delle cose e questi concetti generali può richiedere molta della strada del tuo viaggio nella programmazione, ma sul lungo termine ti renderà più semplice capire nuove tecnologie.</p><h1 id="sommario"><strong>Sommario</strong></h1><ol><li><a href="#storia-del-linguaggio-di-programmazione-c">Storia del linguaggio</a></li><li><a href="#le-caratteristiche-di-c-e-perch-dovresti-impararlo">Caratteristiche di C e perché dovresti impararlo</a></li><li><a href="#dove-viene-utilizzato-c">Dove viene utilizzato C?</a></li><li><a href="#il-processo-di-compilazione-di-c-scrivi-compila-esegui">Processo di compilazione</a></li><li><a href="#come-scrivere-hello-world-in-c">Hello world</a></li><li><a href="#i-file-di-intestazione-in-c">File di intestazione</a></li><li><a href="#il-programma-main-in-c">Programma main</a></li><li><a href="#commenti-in-c">Commenti</a></li><li><a href="#ottenere-un-output-sulla-console-in-c">Ottenere un output sulla console</a></li><li><a href="#variabili-in-c">Variabili</a></li><li><a href="#assegnazione-delle-variabili-in-c">Assegnazione</a></li><li><a href="#come-dichiarare-e-inizializzare-una-variabile-in-c">Dichiarazione e inizializzazione</a></li><li><a href="#nomenclatura-delle-variabili-in-c">Nomenclatura delle variabili</a></li><li><a href="#visibilit-di-una-variabile-in-c">Visibilità delle variabili</a></li><li><a href="#tipi-di-dati-in-c">Tipi di dati</a></li><li><a href="#specificatori-di-formato-in-c">Specificatori di formato</a></li><li><a href="#operatori-in-c">Operatori</a></li><li><a href="#operatori-aritmetici-in-c">Operatori aritmetici</a></li><li><a href="#operatore-di-assegnazione-in-c">Operatore di assegnazione</a></li><li><a href="#operatori-logici-in-c">Operatori logici</a></li><li><a href="#operatori-di-confronto-in-c">Operatori di confronto</a></li><li><a href="#funzioni-in-c">Funzioni</a></li><li><a href="#argomenti-di-funzioni-in-c">Argomenti</a></li><li><a href="#output-di-funzioni-in-c">Output</a></li><li><a href="#come-definire-un-metodo-in-c">Metodi</a></li><li><a href="#come-chiamare-una-funzione-in-c">Chiamare una funzione</a></li><li><a href="#come-usare-le-espressioni-booleane-in-c">Espressioni booleane</a></li><li><a href="#come-usare-le-istruzioni-condizionali-in-c">Istruzioni condizionali</a></li><li><a href="#come-usare-i-loop-in-c">Loop</a></li></ol><h2 id="storia-del-linguaggio-di-programmazione-c"><strong>Storia del linguaggio di programmazione C</strong></h2><p>La storia del linguaggio di programmazione C è strettamente legata alla storia dello sviluppo del sistema operativo Unix.</p><p>Se proviamo a capire cosa ha portato allo sviluppo del sistema operativo che ha cambiato il mondo della programmazione, sapremo quali sono stati gli step che hanno determinato lo sviluppo di C.</p><p>In breve, C è nato dalla necessità di trovare un linguaggio da applicare al sistema operativo Unix.</p><h3 id="progetto-mac-e-multics"><strong>Progetto MAC e MULTICS</strong></h3><p>Iniziò tutto nel 1965, quando il progetto sperimentale MAC fu completato al MIT – il primo sistema del suo genere, che ha segnato l'inizio dell'era MULTICS. Utilizzava una tecnologia chiamata CTSS (Compatible Time Sharing System). </p><p>Per l'epoca fu un'innovazione fondamentale. In quel momento, si era all'inizio dell'era mainframe, dove computer enormi, potenti ed estremamente costosi occupavano stanze intere.</p><p>Per svolgere delle attività, i programmatori dovevano scrivere il codice a mano, per poi perforare delle schede di carta che codificavano il programma appena scritto.</p><p>Lo facevano consegnando i fogli di carta su cui era scritto il programma a degli operatori che utilizzavano una macchina perforatrice per creare dei buchi nelle schede, che rappresentavano dati e istruzioni.</p><p>Poi utilizzavano un lettore di schede perforate connesso al computer mainframe per leggere le schede. In seguito, la sequenza dei buchi nella scheda veniva convertita in informazione digitale. Semplici operazioni necessitavano di tempi lunghi a causa di questo metodo e ogni macchina poteva essere usata soltanto da una persona alla volta.</p><p>L'idea del time sharing ha cambiato ogni cosa. Invece di usare le schede, delle console multiple (che al tempo erano costituite da terminali meccanici detti <em>telescriventi</em>) venivano attaccate al computer principale. Ciò ha permesso a molte persone di usare lo stesso computer simultaneamente.</p><p>Più di 100 terminali telescriventi distribuiti attorno al campus del MIT erano collegati al grande computer centrale. Il sistema supportava fino a 30 utenti, ognuno dei quali usava quei terminali in remoto allo stesso tempo.</p><p>Il sistema operativo del computer centrale svolgeva più compiti contemporaneamente, passando tra le persone che volevano eseguire attività computazionali dai terminali connessi e dando pochi secondi a ognuno di loro.</p><p>Forniva ciò che può assomigliare a un servizio continuo, con molti programmi in esecuzione simultanea. In realtà, passava molto velocemente da un programma di un utente all'altro, dando alla persona l'illusione di avere l'intero computer per sé.</p><p>Questo sistema si è dimostrato estremamente efficiente, efficace e produttivo, permettendo di risparmiare tempo e denaro sul lungo termine, dato che quei computer erano estremamente costosi.</p><p>Ciò che avrebbe richiesto giorni interi per essere completato, ora era fattibile in molto meno tempo, favorendo l'accesso all'utilizzo dei computer.</p><p>Seguendo il successo del CTSS, il MIT decise che era tempo di basarsi su questo sistema e portarlo allo step successivo, creando un sistema più avanzato di time sharing.</p><p>Ma immaginavano un progetto ben più ambizioso: volevano costruire un sistema da usare come risorsa informatica per i programmatori, capace di supportare contemporaneamente centinaia di accessi di utenti al mainframe. E gli utenti sarebbero stati in grado di condividere dati e risorse tra di loro.</p><p>Questo progetto richiedeva più risorse, così si unirono alla General Electric e ai Bell Labs.</p><p>Il nuovo progetto, chiamato MULTICS (da Multiplexed Information and Computing Service), fu implementato nel mainframe della General Electric, il GE 635.</p><p>Il team lavorò su MULTICS per svariati anni, ma nel 1969 il progetto fu abbandonato dai Bell Labs perché stava richiedendo troppo tempo ed era troppo costoso.</p><h3 id="bell-labs-il-centro-dell-innovazione"><strong>Bell Labs: il centro dell'innovazione</strong></h3><p>L'abbandono del progetto MULTICS da parte dei Bell Labs lasciò molti impiegati frustrati e in cerca di alternative. </p><p>Mentre stava lavorando su MULTICS, il team creò un ambiente informatico senza precedenti. Lavoravano con sistemi basati sul time sharing e conoscevano la sua efficacia. Questi programmatori avevano una vasta conoscenza dei sistemi operativi e volevano espandere le innovazioni partite da quel progetto. </p><p>Un gruppo guidato da Ken Thompson e Dennis Ritchie voleva utilizzare un ambiente comune e creare un file system da poter condividere. Avrebbe avuto le caratteristiche innovative che apprezzavano del progetto MULTICS ma un'implementazione più semplice e meno costosa.</p><p>Condivisero le loro idee e iniziarono tentare.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image-4.png" class="kg-image" alt="image-4" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/08/image-4.png 600w, https://www.freecodecamp.org/italian/news/content/images/2022/08/image-4.png 616w" width="616" height="394" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/File:Ken_Thompson_and_Dennis_Ritchie--1973.jpg">Ken Thompson e Dennis Ritchie</a></figcaption></figure><p>I Bell Labs crearono un ambiente aperto e collaborativo che permise all'espressione creativa e all'innovazione di sbocciare. Facevano molta ricerca e incoraggiavano il pensiero indipendente nella risoluzione dei problemi per migliorare le loro soluzioni iniziali.</p><p>Attraverso tanti confronti e sperimentazione hanno realizzarono un cambiamento epocale scrivendo la storia.</p><p>Mentre stava ancora lavorando su MULTICS, Ken Thompson creò un gioco chiamato Space Travel. Lo aveva inizialmente scritto per MULTICS, sul GE 635, ma quando i Bell Lab si chiamarono fuori, adattò il gioco in un programma Fortran da eseguire sul sistema operativo GECOS del GE 635.</p><p>Il gioco aveva molti problemi – su GECOS non funzionava così bene come faceva su MULTICS e aveva bisogno di una macchina diversa e meno costosa su cui girare.</p><p>A Ken Thompson furono negati i fondi richiesti per creare un diverso sistema operativo, dato che i Bell Labs si erano chiamati già fuori dal progetto. Alla fine, riuscì a trovare un vecchio minicomputer DEC PDP-7 poco usato con cui fare un tentativo – era l'unico sistema disponibile.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image-5.png" class="kg-image" alt="image-5" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/08/image-5.png 600w, https://www.freecodecamp.org/italian/news/content/images/2022/08/image-5.png 1000w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/File:Pdp7-oslo-2005.jpeg">Un DEC PDP-7</a></figcaption></figure><p>Iniziò a scrivere il suo gioco su quel semplice sistema ma era limitato dal software del computer. Così, mentre ci stava lavorando su, finì a implementare lo scheletro del file system che il suo team aveva ideato.</p><p>Partì con un file system gerarchico, un interprete della riga di comando e altri programmi di utilità. In un mese, riuscì a creare un sistema operativo con un assembler, un editor e uno shell, con funzionalità ridotte e più semplici rispetto a MULTICS: era nata la prima versione di Unix.</p><h3 id="gli-albori-di-unix-e-del-linguaggio-assembly"><strong>Gli albori di Unix e del linguaggio assembly</strong></h3><p>All'inizio del progetto, Ken Thompson non poteva programmare sul computer DEC PDP-7. I suoi programmi dovevano essere compilati e tradotti sul più potente mainframe GE 635 e poi l'output doveva essere fisicamente trasferito sulla scheda del PDP-7.</p><p>Il DEC PDP-7 aveva una memoria molto ridotta di soli 8 KB. Per far fronte a questa limitazione, il file system, la prima versione del kernel di Unix e praticamente ogni altra cosa nel progetto era programmata in assembly. L'uso di assembly permetteva a Thompson di manipolare direttamente e controllare ogni parte della memoria di quel computer.</p><p>Il linguaggio assembly è un linguaggio di programmazione di basso livello che utilizza del codice simbolico ed è vicino al linguaggio macchina, il codice binario. Le istruzioni del codice e ogni istruzione nel linguaggio corrispondono strettamente alle istruzioni-macchina specifiche per l'architettura del computer.</p><p>È dipendente dalla macchina e specifico, così che un'insieme di istruzioni ha risultati molto differenti a seconda della macchina su cui viene eseguito. I programmi scritti in linguaggio assembly sono pensati per uno specifico tipo di processore – quindi un programma scritto in assembly non si adatta a processori diversi.</p><p>A quel tempo, era comune scrivere sistemi operativi usando il linguaggio assembly e quando iniziarono a lavorare su Unix, non avevano in mente di renderlo portabile.</p><p>A loro non interessava che il sistema operativo fosse in grado di operare su sistemi e architetture macchina diversi. Questa idea arrivò più tardi. La loro priorità era l'efficienza del software.</p><p>Mentre lavoravano su MULTICS, usavano linguaggi di programmazione ad alto livello (PL/I all'inizio e poi BCPL). I programmatori si erano abituati a utilizzare linguaggi di programmazione ad alto livello per scrivere software come sistemi operativi, utilità e strumenti, per via dei vantaggi che offrivano (erano relativamente facili da usare e da capire).</p><p>Nell'uso di un linguaggio di programmazione di alto livello, c'è un'astrazione tra l'architettura del computer e svariati altri dettagli oscuri. Questo significa che il linguaggio si trova sopra il livello della macchina e non c'è manipolazione diretta della memoria dell'hardware.</p><p>I linguaggi di alto livello sono più facili da leggere, imparare, comprendere e gestire. Ciò fa sì che siano una scelta più facile per lavorare in gruppo. I comandi hanno una sintassi che ricorda l'inglese e i termini e le istruzioni sono più familiari e a misura d'uomo rispetto al formato simbolico di assembly.</p><p>Usare linguaggi di alto livello significa anche scrivere meno codice per compiere delle operazioni, mentre i programmi in assembly sono estremamente lunghi.</p><p>Fin dal principio, Thompson voleva usare un linguaggio di alto livello per Unix, ma era limitato dal DEC PDP-7.</p><p>Con il progredire del progetto e l'aggiunta di altre persone al gruppo, l'uso di assembly non era ideale. Thompson decise che Unix aveva bisogno di un linguaggio di programmazione di alto livello.</p><p>Nel 1970 ottenne i fondi per il più grande e potente DEC PDP-11, che sostanzialmente aveva più memoria.</p><p>Con un linguaggio di programmazione di alto livello, più veloce, strutturato ed efficiente in grado di sostituire assembly, tutti avrebbero potuto capire il codice e i compilatori sarebbero stati disponibili per macchine diverse.</p><p>Iniziarono ad esplorare linguaggi differenti per scrivere sistemi software da usare per implementare Unix.</p><h3 id="da-b-a-c-il-bisogno-di-un-nuovo-linguaggio"><strong>Da B a C: il bisogno di un nuovo linguaggio</strong></h3><p>L'obiettivo era creare utilità – programmi che aggiungono funzionalità – da eseguire su Unix. Thompson tentò inizialmente di creare un compilatore FORTRAN ma poi optò per un linguaggio che aveva già utilizzato, BCPL (Basic Combined Programming Language).</p><p>BCPL era stato progettato e sviluppato alla fine degli anni '60 da Martin Richards. Il suo utilizzo principale era per scrivere compilatori e sistemi software.</p><p>Questo linguaggio era lento e aveva molte limitazioni, così quando Thompson iniziò a usarlo nel 1970 per il progetto Unix sul DEC PDP-7, fece degli aggiustamenti e delle modifiche e finì per scrivere un linguaggio tutto suo, chiamato B.</p><p>B aveva molte delle funzionalità di BCPL ma era un linguaggio più snello, con meno sintassi verbose e uno stile più semplice. Era ancora lento e non abbastanza potente per supportare le utilità di Unix, inoltre, non poteva trarre vantaggio dalle potenti funzionalità del PDP-11.</p><p>Dennis Ritchie decise di migliorare i due linguaggi precedenti, BCPL e B. Prese funzionalità e caratteristiche da entrambi e aggiunse altri concetti. Creò un linguaggio più potente ed efficiente – C – tanto quanto assembly. Questo nuovo linguaggio superò le limitazioni dei linguaggi precedenti, permettendo anche di sfruttare efficientemente le potenzialità della macchina.</p><p>Così, nel 1972, nacque C, con il primo compilatore C scritto e implementato per la prima volta sul DEC PDP-11.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image-6.png" class="kg-image" alt="image-6" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/08/image-6.png 600w, https://www.freecodecamp.org/italian/news/content/images/2022/08/image-6.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="750" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/Ken_Thompson#/media/File:Ken_Thompson_(sitting)_and_Dennis_Ritchie_at_PDP-11_(2876612463).jpg">Una famosa immagine di Thompson e Ritchie al lavoro su un PDP-11</a></figcaption></figure><h3 id="il-linguaggio-di-programmazione-c"><strong>Il linguaggio di programmazione C</strong></h3><p>Nel 1973, Dennis Ritchie riscrisse il codice sorgente di Unix e la maggior parte dei programmi e delle applicazioni usando il linguaggio di programmazione C, che divenne il linguaggio di implementazione standard del sistema operativo.</p><p>Reimplementò il kernel di Unix in C scrivendo quasi tutto il sistema operativo (ben oltre il 90%) in questo linguaggio di alto livello. C unisce sia le caratteristiche di leggibilità del linguaggio di alto livello con le funzionalità di basso livello, rendendolo la scelta perfetta per scrivere un sistema operativo.</p><p>Verso la fine degli anni '70, la popolarità di C iniziò a crescere e il linguaggio a diventare più ampiamente supportato e sviluppato. Fino a quel punto, C era ancora soltanto disponibile per i sistemi Unix e i compilatori non erano disponibili fuori dai Bell Labs.</p><p>L'aumento della popolarità derivò non solo dalle potenzialità date da C alla macchina, ma anche al programmatore. Fu d'aiuto anche il fatto che il sistema operativo Unix stesse diventando più diffuso a un ritmo addirittura maggiore.</p><p>Unix si distingueva da tutto ciò che era conosciuto per via della sua portabilità e della possibilità di essere eseguito su una varietà di macchine, sistemi e ambienti differenti.</p><p>C ha reso possibile la portabilità e dal momento in cui venne utilizzato come linguaggio del sistema Unix, ha guadagnato molta notorietà – sempre più programmatori hanno voluto provarlo.</p><p>Nel 1978, Brian Kernighan e Dennis Ritchie scrissero in collaborazione e pubblicarono la prima edizione del libro 'Il linguaggio di programmazione C', conosciuto nella comunità dei programmatori anche con il nome di 'K&amp;R'. Per molti anni, questo è stato il testo di riferimento per la descrizione e definizione del linguaggio C. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image-7.png" class="kg-image" alt="image-7" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2022/08/image-7.png 600w, https://www.freecodecamp.org/italian/news/content/images/2022/08/image-7.png 828w" sizes="(min-width: 720px) 720px" width="828" height="1192" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/C_(programming_language)#History">Copertina del libro</a></figcaption></figure><p>Negli anni '80, la popolarità di C salì alle stelle dato che diversi compilatori furono creati e commercializzati. Molti gruppi e aziende che non erano state coinvolte nella progettazione di C iniziarono a produrre compilatori per ogni sistema operativo e architettura di computer, rendendo C disponibile su tutte le piattaforme.</p><p>Dato che queste società creavano i compilatori per conto proprio, iniziarono a cambiare le caratteristiche del linguaggio per adattare il compilatore a ogni piattaforma per cui era stato scritto.</p><p>Esistevano varie versioni di C con piccole differenze tra di loro. Mentre scrivevano i compilatori, questi gruppi svilupparono le proprie interpretazioni di alcuni aspetti del linguaggio, basate sulla prima edizione del libro 'Il linguaggio di programmazione C'.</p><p>Dopo tutte le prove e gli aggiustamenti, il libro non descriveva più il linguaggio originario, e i cambiamenti iniziarono a causare dei problemi.</p><p>Il mondo aveva bisogno di una versione comune di C, uno standard per il linguaggio.</p><h3 id="lo-standard-c"><strong>Lo standard C</strong></h3><p>Nel 1983, l'ANSI (American National Standards Institute) formò una commissione per far sì che la definizione del linguaggio fosse standardizzata e indipendente dalla macchina. La commissione, chiamata X3J11, aveva il compito di fornire una definizione e una standardizzazione di C chiara ed esaustiva.</p><p>Dopo pochi anni, nel 1989, la commissione terminò il suo lavoro e lo rese ufficiale. Avevano definito uno standard commerciale per il linguaggio. Quella versione del linguaggio è conosciuta come 'ANSI C' o C89.</p><p>C venne utilizzato in tutto il mondo e un anno dopo, nel 1990, lo standard fu approvato e adottato dall'ISO (International Standards Organization). La prima versione, C90, fu chiamata ISO/IEC 9899:1990.</p><p>Da allora, ci sono state molte revisioni del linguaggio.</p><p>Nel 1999, fu pubblicata C99, la seconda versione dello standard (denominata ISO/IEC 9899:1999), che introdusse nuove funzionalità addizionali nel linguaggio. La terza versione, C11, fu pubblicata nel 2011. La più recente è la quarta, C17, denominata ISO/IEC 9899:2018.</p><h3 id="la-continuazione-di-c"><strong>La continuazione di C</strong></h3><p>C ha tracciato il sentiero per la creazione di un gran numero di linguaggi di programmazione diversi. Molti dei moderni linguaggi di programmazione di alto livello che usiamo e amiamo sono basati su C.</p><p>E molti dei linguaggi creati dopo C dovevano ovviare ai problemi che C non poteva risolvere, o superare alcune delle sue limitazioni. Ad esempio, il discendente più popolare di C è la sua estensione orientata agli oggetti C++, ma anche Go, Java e JavaScript si ispirano a C.</p><h2 id="le-caratteristiche-di-c-e-perch-dovresti-impararlo"><strong>Le caratteristiche di C e perché dovresti impararlo</strong></h2><p>C è un linguaggio vecchio, ma attualmente è ancora popolare, anche dopo tutti questi anni.</p><p>Deve la sua popolarità all'ascesa e al successo di Unix, ma è andato ben oltre l'essere il linguaggio 'originario' di Unix. Attualmente è alla base della maggior parte, se non di tutti i server e sistemi nel mondo.</p><p>I linguaggi di programmazione sono strumenti che utilizziamo per risolvere specifici problemi informatici che ci influenzano su larga scala.</p><p>Non hai bisogno di conoscere C per creare pagine e applicazioni web, ma torna utile quando vuoi scrivere un sistema operativo, un programma che controlla altri programmi, un'utilità di programmazione per lo sviluppo del kernel o quando vuoi programmare dispositivi integrati in qualsiasi applicazione di sistema. C eccelle in tutte queste attività, quindi vediamo insieme alcune ragioni per apprendere questo linguaggio.</p><h3 id="c-aiuta-a-capire-come-funziona-un-computer"><strong>C aiuta a capire come funziona un computer</strong></h3><p>Nonostante C sia un linguaggio di programmazione <em>general purpose</em>, è principalmente usato per interagire con le funzioni macchina di basso livello. A parte le ragioni pratiche dietro all'apprendimento del linguaggio, conoscere C può aiutarti a capire come funziona effettivamente un computer, cosa accade dietro le quinte e come i programmi vengono realmente eseguiti sulle macchine.</p><p>Dato che C è considerato la base di altri linguaggi di programmazione, se sei in grado di comprendere i concetti su cui si basa, in seguito, ti sarà molto più facile imparare altri linguaggi.</p><p>Scrivere del codice C ci fa comprendere i processi nascosti che si verificano nei nostri computer, permettendoci ci avvicinarci all'hardware senza confonderci con il linguaggio assembly. Ci dà anche accesso a una moltitudine di azioni di basso livello restando leggibile come i linguaggi di alto livello. </p><h3 id="c-veloce-ed-efficiente"><strong>C è veloce ed efficiente</strong></h3><p>Allo stesso tempo, non perdiamo la funzionalità, l'efficienza e il controllo di basso livello sull'esecuzione del codice che fornisce assembly.</p><p>Ricorda che ogni processore nell'hardware di un qualsiasi dispositivo possiede il proprio codice assembly, che è unico per quel processore e non è affatto compatibile con tutti i processori di altri dispositivi.</p><p>Usare C ci garantisce un approccio più veloce, facile e complessivamente meno macchinoso, nei confronti dell'interazione con il computer nel suo livello più basso. Infatti, è una commistione di funzionalità sia di alto che di basso livello e ci aiuta a svolgere un compito senza i problemi e le scocciature del lungo e spesso poco comprensibile codice assembly.</p><p>Dunque, C è quanto più vicino tu possa arrivare all'hardware del computer e costituisce un ottimo rimpiazzo per assembly (il vecchio standard per scrivere sistemi operativi) quando stai lavorando sull'implementazione di un software di sistema.</p><h3 id="c-potente-e-flessibile"><strong>C è potente e flessibile</strong></h3><p>La stretta vicinanza all'hardware implica che il codice C debba essere scritto in modo esplicito e preciso. Ti dà una chiara immagine di un modello mentale per capire come il codice interagisce con il computer.</p><p>C non nasconde la complessità con cui una macchina opera. Ti dà potere e flessibilità, come l'abilità di assegnare, manipolare e scrivere direttamente nella memoria.</p><p>Il programmatore svolge un sacco di duro lavoro e il linguaggio permette di gestire e strutturare la memoria in un modo efficiente per la macchina, garantendo performance elevate, ottimizzazione e velocità. C permette al programmatore di fare ciò di cui ha bisogno.</p><h3 id="c-portabile-prestante-e-indipendente-dalla-macchina"><strong>C è portabile, prestante e indipendente dalla macchina</strong></h3><p>C è anche altamente portabile e indipendente dalla macchina. Anche se è vicino alla macchina e ha accesso alle sue funzioni di basso livello, possiede un'astrazione da quelle componenti, tale da rendere possibile la portabilità. </p><p>Dato che le istruzioni assembly sono specifiche per ogni macchina, i programmi non sono portabili. Un programma scritto su una macchina dovrebbe essere riscritto per essere eseguito su un'altra, ed è complicato gestire tutto ciò considerando l'architettura di ogni computer.</p><p>C è universale e i programmi scritti in C possono essere compilati ed eseguiti su un gran numero di piattaforme, architetture e una varietà di macchine senza perdite in termini di prestazioni. Questo è ciò che fa di C un'ottima scelta per la creazione di sistemi e programmi in cui la performance è cruciale.</p><h3 id="c-ha-ispirato-la-creazione-di-molti-linguaggi-di-programmazione"><strong>C ha ispirato la creazione di molti linguaggi di programmazione</strong></h3><p>Molti linguaggi oggi comunemente usati, come Python, Ruby, PHP e Java, traggono ispirazione da C. Questi linguaggi moderni si basano su C per operare efficientemente. Anche le loro librerie, i loro compilatori e interpreti sono costruiti in C.</p><p>Questi linguaggi nascondono la maggior parte dei dettagli sul funzionamento reale di un programma e, utilizzandoli, non devi aver a che fare con l'assegnazione della memoria, bit e byte, in quanto ci sono più livelli di astrazione. Non hai bisogno di un simile controllo dettagliato con applicazioni di alto livello dove ogni interazione con la memoria può determinare degli errori.</p><p>Ma quando stai implementando una parte di un sistema operativo e di un dispositivo integrato, conoscere quei dettagli di basso livello e di manipolazione diretta può aiutarti a scrivere un codice più pulito.</p><h3 id="c-un-linguaggio-compatto"><strong>C è un linguaggio compatto</strong></h3><p>Nonostante C possa essere piuttosto criptico e difficile da comprendere per i principianti, è in realtà un linguaggio ragionevolmente ridotto e compatto con una sintassi e un insieme di parole chiave e di funzioni integrate minimale. Quindi, puoi sperare di imparare e utilizzare le sue funzionalità basilari, già esplorandone il funzionamento.</p><p>Anche se non sei interessato a imparare come programmare un sistema operativo o un'applicazione di sistema, conoscere le basi di C e il modo in cui interagisce con il computer ti darà delle buone basi di concetti e principi informatici.</p><p>Inoltre, capire come funziona ed è organizzata una memoria è un concetto di programmazione fondamentale. Quindi, comprendere il funzionamento di un computer a un livello più profondo e i processi che avvengono al suo interno, può davvero aiutarti a imparare e utilizzare altri linguaggi.</p><h2 id="dove-viene-utilizzato-c"><strong>Dove viene utilizzato C?</strong></h2><p>C'è tantissimo codice C nei dispositivi, prodotti e strumenti che che utilizziamo nelle nostre vite quotidiane. Questo codice è alla base di tutto, dai supercomputer ai gadget più piccoli. </p><p>Il codice C fa funzionare i sistemi integrati e i dispositivi smart di tutti i tipi. Alcuni esempi sono le applicazioni domestiche come frigoriferi, TV, macchine da caffè, lettori DVD e videocamere digitali.</p><p>Il tuo fitness tracker e il tuo smart watch? Basati su C. Il sistema di rilevamento GPS della tua automobile e i semafori? Hai indovinato – C. E ci sono molti altri esempi di sistemi integrati che si basano sul codice C usati nell'industria medicale, robotica e automobilistica.</p><p>Un'altra area in cui C è ampiamente usato è nello sviluppo di sistemi operativi e kernel. A parte Unix, per cui il linguaggio è stato creato, altri importanti e popolari sistemi operativi, in una certa misura, sono programmati in C.</p><p>Il kernel di Microsoft Windows è scriptato principalmente in C, così come il kernel di Linux. La maggior parte dei supercomputer e anche dei server di Intenet si basa su Linux. Ciò significa che C è alla base di un'ampia porzione di internet.</p><p>Linux alimenta anche i dispositivi Android, quindi il codice C fa funzionare non solo i supercomputer, ma anche i computer personali e gli smartphone. Perfino OSX è parzialmente programmato in C, facendo sì che anche i computer Mac si basino su C.</p><p>C è anche diffuso per lo sviluppo di applicazioni desktop e di interfacce grafiche (GUI). La gran parte delle applicazioni Adobe che utilizziamo per l'editing di foto e video e per la progettazione grafica (come Photoshop, Adobe illustrator e Adobe Premiere) è programmata con C o il suo successore, C++.</p><p>I compilatori, gli interpreti e gli assembler per una varietà di linguaggi sono progettati e costruiti con C – infatti, questi sono alcuni degli utilizzi più comuni del linguaggio.</p><p>Molti dei browser e delle loro estensioni sono realizzati con C, come Google Chromium e il file system di Google. Gli sviluppatori usano spesso C anche nella progettazione di database (MySQL e Oracle sono due dei sistemi di database più famosi realizzati in C) e per la grafica avanzata di molti videogiochi.</p><p>Da questa panoramica, possiamo vedere che C e il suo derivato C++ gestiscono la gran parte di internet e del mondo in generale. Molti degli apparecchi e delle tecnologie che usiamo nelle nostre vite quotidiane sono scritte o dipendono da C.</p><h2 id="il-processo-di-compilazione-di-c-scrivi-compila-esegui"><strong>Il processo di compilazione di C: scrivi-compila-esegui</strong></h2><h3 id="cos-un-programma-in-c"><strong>Cos'è un programma in C?</strong></h3><p>Un programma per computer scritto in C è un insieme ordinato di istruzioni comprensibili ed eseguibili da un computer. Punta a fornire una soluzione per uno specifico problema informatico e dice al computer di svolgere una determinata azione tramite una sequenza di istruzioni da seguire.</p><p>Essenzialmente, tutti i programmi sono soltanto semplici file di testo memorizzati nell'hard drive del computer, che utilizzano una sintassi speciale, definita dal linguaggio di programmazione che stai usando.</p><p>Ogni linguaggio ha le proprie regole che determinano cosa puoi scrivere e cosa è considerato valido e cosa no.</p><p>Un programma possiede delle parole chiave, ovvero delle parole specifiche che sono riservate e fanno parte del linguaggio. Contiene anche pezzi letterali di dati come stringhe e numeri. Ha parole specifiche che seguono le regole del linguaggio, che definiamo e introduciamo (come variabili e metodi). </p><h3 id="cos-un-compilatore"><strong>Cos'è un compilatore?</strong></h3><p>I programmi sono scritti da noi e per noi. Sono fatti per essere compresi dalle persone.</p><p>Quando scriviamo programmi in forma leggibile, possiamo capirli – ma il computer potrebbe non esserne in grado. I computer non capiscono direttamente i linguaggi di programmazione, ma soltanto il binario. Quindi i programmi devono essere tradotti così che il computer possa realmente capire le istruzioni del programma. </p><p>I programmi scritti in linguaggi di alto livello possono essere compilati o interpretati. Fanno uso di parti speciali di software chiamati rispettivamente compilatori e interpreti.</p><h3 id="qual-la-differenza-tra-un-compilatore-e-un-interprete"><strong>Qual è la differenza tra un compilatore e un interprete?</strong></h3><p>Sia i compilatori che gli interpreti sono programmi, ma di una complessità di gran lunga superiore a quelli usuali e agiscono come traduttori. Prendono un programma così com'è scritto e lo trasformano in una forma comprensibile per il computer. E rendono possibile l'esecuzione di programmi su sistemi differenti.</p><p>I programmi compilati vengono prima convertiti in una forma comprensibile dal computer, ovvero vengono tradotti in linguaggio macchina prima di essere eseguiti. Il codice macchina è un linguaggio numerico – istruzioni binarie composte da una sequenza di 0 e &nbsp;1.</p><p>La compilazione produce un programma eseguibile, che è un file contenente il codice in linguaggio macchina, che la CPU (Central Processing Unit) sarà in grado di leggere, capire ed eseguire direttamente.</p><p>Dopodiché, il programma può girare e il computer fa quello che il programma gli dice di fare. I programmi compilati hanno una corrispondenza più forte con l'hardware e possono manipolare più facilmente la CPU e la memoria del computer. </p><p>I programmi interpretati, d'altro canto, non sono eseguiti direttamente dalla macchina né hanno bisogno di essere tradotti in un programma in linguaggio macchina. Invece, utilizzano un interprete che traduce automaticamente e direttamente, ed esegue ogni dichiarazione o istruzione del codice riga per riga durante il run time.</p><p>C è un linguaggio di programmazione compilato. Ciò significa che usa un compilatore per analizzare il codice sorgente scritto in C che viene poi convertito in un file binario che l'hardware del computer può eseguire direttamente. Tutto ciò è specifico per ogni macchina.</p><h3 id="come-utilizzare-il-compilatore-gcc-con-esempi"><strong>Come utilizzare il compilatore GCC con esempi</strong></h3><p>Unix e altri sistemi simili hanno già un compilatore C integrato e installato. Questo vuol dire che Linux e MacOS hanno un compilatore integrato molto popolare, chiamato compilatore GCC (o GNU Compiler Collection).</p><p>Nel resto di questa sezione, vedremo alcuni esempi relativi a questo compilatore. Ho basato questi esempi su sistemi Unix o simili, quindi se hai un sistema Windows, assicurati di abilitare il <a href="https://apps.microsoft.com/store/detail/ubuntu-on-windows/9NBLGGH4MSV6?hl=en-us&amp;gl=US">sottosistema Windows per Linux</a>.</p><p>Prima di tutto, assicurati di avere il compilatore GCC installato. Puoi verificarlo aprendo il terminale e scrivendo <code>gcc --version</code> nel prompt, tipicamente dopo il carattere <code>$</code>.</p><p>Se stai usando MacOS e non hai installato gli strumenti per sviluppatori da riga di comando, visualizzerai una finestra di dialogo che ti chiederà di installarli – quindi se la vedi, prosegui pure.</p><p>Una volta aver proceduto con l'installazione, apri un nuovo terminale e riscrivi il comando <code>gcc --version</code>. Se hai già installato gli strumenti da riga di comando, dovresti ottenere l'output qui sotto:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-02-17-at-3.02.52-PM.png" class="kg-image" alt="Screenshot-2021-02-17-at-3.02.52-PM" width="600" height="400" loading="lazy"></figure><p>Il solo termine compilazione è un'astrazione e una semplificazione, dato che in realtà ci sono molti step che avvengono in dietro le quinte. Sono i dettagli di basso livello più sottili che avvengono tra il momento in cui scriviamo, la compilazione e l'esecuzione del programma in C, la cui maggior parte, avviene automaticamente senza che ce ne rendiamo conto.</p><h3 id="come-scrivere-il-codice-sorgente-c"><strong>Come scrivere il codice sorgente C</strong></h3><p>Per sviluppare dei programmi in C, abbiamo bisogno di un qualche tipo di editor di testo. Un editor di testo è un programma che usiamo per scrivere il nostro codice (chiamato codice sorgente) in un file di testo.</p><p>Per questo, abbiamo bisogno di un editor di testo da riga di comando come nano o Vim.</p><p>Puoi anche utilizzare un IDE (Integrated Development Environment) o un editor di testo con caratteristiche di IDE (un terminale integrato, la possibilità di scrivere, fare debug, eseguire i nostri programmi in solo posto senza lasciare l'editor, e molto altro).</p><p>Visual Studio Code è un editor con queste caratteristiche, e ha un'<a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools">estensione </a><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools">C/C++</a>. Per tutto il resto di questo tutorial useremo VSCode.</p><p>Tornando al nostro terminale, prosegui e scrivi i comandi qui sotto per creare un file in cui il nostro codice C prenderà vita.</p><pre><code class="language-shell">`cd` # Ci porta alla directory principale, se non ci siamo già
`mkdir cprogram` # Crea una directory chiamata cprogram 
`cd cprogram` # Ci porta alla directory cprogram appena creata
`touch hello.c` # Crea un file chiamato hello
`code .` # Apre VSCODE nella directory attuale
</code></pre><p>Abbiamo appena creato un semplice file di testo, <code>hello.c</code>. Questo file conterrà il codice scritto in linguaggio C, ovvero sarà un programma in C, come indicato dall'estensione convenzionale <code>.c</code>.</p><p>Al suo interno possiamo scrivere qualsiasi programma in C desideriamo, partendo da uno estremamente semplice che dà come output 'Hello world'.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/hello_world.png" class="kg-image" alt="hello_world" width="600" height="400" loading="lazy"></figure><p>Per vedere cosa fa effettivamente il nostro codice, dobbiamo eseguire il programma che abbiamo appena scritto. Prima di farlo, però, dobbiamo compilarlo, scrivendo il comando nel terminale.</p><p>Possiamo continuare a usare la riga di comando sul nostro computer oppure possiamo usare il terminale integrato di VSCode (premendo insieme i tasti <code>control ~</code> si aprirà una nuova finestra terminale).</p><p>Possiamo vedere che sul pannello di sinistra c'è solo un file nella cartella <code>cprogram</code>, <code>hello.c</code>, che contiene il nostro codice C.</p><p>La "compilazione del codice C" non avviene in un solo passaggio e include alcune azioni minori che si verificano automaticamente.</p><p>Quando ci riferiamo alla compilazione, intendiamo tipicamente che il compilatore prende il codebase come input (il codice che abbiamo scritto in C, che ha una sintassi simile all'inglese) e lo traduce per produrre delle istruzioni in linguaggio macchina come output.</p><p>Questo codice macchina corrisponde direttamente alle istruzioni del nostro codice sorgente, ma è scritto in un modo comprensibile dalla CPU, così che questa possa prendere le istruzioni ed eseguirle.</p><h3 id="come-il-codice-sorgente-in-c-viene-trasformato-in-binario"><strong>Come il codice sorgente in C viene trasformato in binario</strong></h3><p>Abbiamo descritto l'idea generale – ma nel processo sono coinvolti 4 passaggi minori. Quando compiliamo il nostro codice, in realtà lo stiamo <strong>precompilando</strong>,<strong><strong> </strong>compilando</strong>,<strong><strong> assembl</strong>ando </strong>e<strong><strong> </strong>collegando</strong>.</p><p>Questi step iniziano ad accadere quando scriviamo nel terminale il comando <code>gcc hello.c</code>, contenente il nome del compilatore e del file con il codice sorgente, rispettivamente. </p><p>Volendo, avremmo potuto personalizzare il comando scrivendone uno più specifico come <code>gcc -o hello hello.c</code>, dove:</p><ul><li><code>-o</code> sta per 'output'</li><li><code>hello</code> è il nome che specifichiamo per il file eseguibile del programma di cui vogliamo che sia creato l'output</li><li><code>hello.c</code> è il file che il compilatore <code>gcc</code> prenderà come input (il file che contiene il nostro codice sorgente e che vogliamo compilare).</li></ul><p>Un altro programma che è parte del compilatore svolge questo primo step – il preprocessore. Il preprocessore fa molte cose – ad esempio, agisce come uno strumento "trova e sostituisci", scansionando il codice sorgente in cerca di istruzioni particolari e righe che iniziano con <code>#</code>.</p><p>Le righe che iniziano con un <code>#</code>, come <code>#include</code>, vengono chiamate direttive di precompilazione. Ogni riga che inizia con un <code>#</code> indica al preprocessore che va fatto qualcosa. In particolare, comunica che la riga dovrebbe essere automaticamente sostituita con qualcos'altro. Non vediamo questo processo, ma accade dietro le quinte.</p><p>Ad esempio, quando il preprocessore trova la riga <code>#include &lt;stdio.h&gt;</code> nel programma <code>hello world</code>, <code>#include</code> dice letteralmente al preprocessore di inserire, con un copia e incolla, tutto il codice del file di intestazione (che è una libreria esterna, <code>stdio.h</code>) al posto di questa istruzione nel nostro codice sorgente. Quindi sostituisce la riga <code>#include &lt;stdio.h&gt;</code> con il contenuto del file <code>stdio.h</code>.</p><p>Nella libreria <code>stdio.h</code> ci sono prototipi di funzioni e definizioni o suggerimenti. In questo modo, tutte le funzioni sono definite in modo che il computer le riconosca durante il tempo di compilazione e che noi possiamo usarle nel nostro programma.</p><p>Ad esempio, all'interno di <code>&lt;stdio.h&gt;</code>, la funzione <code>printf();</code> è definita come <code>int printf(const char *format,…);</code>. Gli stessi passaggi si verificano per gli altri file di intestazione (i file con l'estensione <code>.h</code>).</p><p>Durante la precompilazione, i commenti nel nostro codice vengono rimossi e le macro vengono espanse e rimpiazzate dai loro valori. Una <em>macro </em>è un frammento di codice a cui è stato dato un nome.</p><p>In questo stadio, se non ci sono errori nel nostro codice, non dovrebbe esserci un output nel terminale, il che è un buon segno.</p><p>Non vediamo nessun output, ma è stato creato un nuovo file con l'estensione <code>.i</code>, che è ancora in codice sorgente C. Questo file include l'output della precompilazione, quindi viene chiamato codice sorgente precompilato. In questo caso, è stato generato un nuovo file <code>hello.i</code>, ma non sarà visibile nel nostro editor.</p><p>Se eseguiamo il comando <code>gcc -E hello.c</code>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-02-at-8.29.46-PM.png" class="kg-image" alt="Screenshot-2021-03-02-at-8.29.46-PM" width="600" height="400" loading="lazy"></figure><p>Saremo in grado di vedere tutto il contenuto di questo file (che è piuttosto grande), la cui fine dovrebbe essere simile a:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-02-at-8.30.05-PM.png" class="kg-image" alt="Screenshot-2021-03-02-at-8.30.05-PM" width="600" height="400" loading="lazy"></figure><p>Se ci sono degli errori che inficiano la correttezza del nostro codice o non stiamo seguendo la semantica del linguaggio, vedremo dei messaggi di errore e la compilazione si bloccherà. Dovremo correggere gli errori e far ripartire il processo dall'inizio.</p><h4 id="la-compilazione-in-c"><strong>La compilazione in C</strong></h4><p>Dopo la precompilazione, che produce il codice sorgente C precompilato, avviene la compilazione. Questo processo consiste nel prendere il codice (che è ancora codice sorgente in C) e modificarlo in un'altra forma intermedia. Questo passaggio viene svolto da un compilatore.</p><p>Per rinfrescarci la memoria, un compilatore è un programma che prende il codice sorgente come input e lo traduce in una forma più vicina al linguaggio nativo dei computer. </p><p>Riferendoci alla compilazione, possiamo intendere sia l'intero processo di traduzione del codice sorgente in un codice oggetto (codice macchina) o soltanto uno step specifico dell'intero processo di compilazione.</p><p>Il passaggio di cui stiamo discutendo adesso riguarda la conversione, da parte del compilatore, di ogni istruzione del codice sorgente C preprocessato in un linguaggio più familiare e più vicino al binario, il linguaggio che un computer può capire direttamente.</p><p>Questo linguaggio intermedio è codice assembly, un linguaggio di programmazione di basso livello usato per controllare la CPU e manipolarla per svolgere operazioni specifiche e avere accesso alla memoria del computer. Ricordi il codice assembly di cui abbiamo parlato nella sezione sulla storia di C?</p><p>Ogni CPU – il cervello del computer – ha le proprie istruzioni. Il codice assembly sfrutta delle istruzioni e dei comandi direttamente correlati con le istruzioni e le operazioni di basso livello che vengono svolte da una CPU.</p><p>In questo step del processo di compilazione, ogni istruzione del codice sorgente C preprocessato nel file <code>hello.i</code> è tradotta dal compilatore nell'istruzione equivalente in linguaggio assembly, a un livello più basso.</p><p>L'output di quest'azione crea un file con estensione <code>.s</code> (nel nostro caso <code>hello.s</code>) che contiene le istruzioni in assembly.</p><p>Con il comando <code>gcc -S hello.c</code> possiamo vedere il contenuto e i comandi in assembly piuttosto incomprensibili del file <code>hello.s</code>, creato dal compilatore (ma non visibile scrivendo semplicemente <code>gcc hello.c</code>).</p><p>Guardando con attenzione, vedremo un paio di parole chiave e istruzioni familiari, usate nel nostro codice sorgente C. Ad esempio, <code>main</code> e <code>printf</code>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-at-11.15.27-AM.png" class="kg-image" alt="Screenshot-2021-03-12-at-11.15.27-AM" width="600" height="400" loading="lazy"></figure><h4 id="l-assemblaggio-in-c"><strong>L'assemblaggio in C</strong></h4><p>L'assemblaggio consiste nel prendere come input il file <code>hello.s</code> contenente il codice assembly e, con l'aiuto di un altro programma che viene eseguito automaticamente nel processo di compilazione, assemblarlo in istruzioni in codice macchina. Questo vuol dire avere un output di istruzioni in formato binario, composto di una serie di 0 e 1.</p><p>Questo passaggio avviene in background e genera le istruzioni nel linguaggio finale, tradotte a partire dal nostro codice sorgente. Adesso il computer è finalmente in grado di capire le istruzioni.</p><p>Ogni comando che abbiamo scritto nel codice sorgente C è stato trasformato in istruzioni in linguaggio assembly e, infine, nelle istruzioni equivalenti in binario. Tutto ciò è accaduto con il comando <code>gcc</code>. Wow!</p><p>Il codice che abbiamo adesso è detto codice oggetto e può essere compreso da una specifica CPU. Il linguaggio è incomprensibile per noi umani.</p><p>Le persone programmavano in linguaggio macchina, ma era un procedimento tedioso. È difficile raccapezzarsi con tutti i simboli che non fanno parte del codice macchina (cioè tutto ciò che non è 0 o 1). Programmare in questo modo rende estremamente facile commettere degli errori.</p><p>In questo stadio, viene creato un altro file con un'estensione <code>.o</code> (che sta per oggetto) – <code>hello.o</code> nel nostro caso.</p><p>Possiamo vedere il contenuto del file oggetto contenente le istruzioni al livello macchina con il comando <code>gcc -c hello.c</code>. Se lo facciamo, in <code>hello.o</code> vedremo del contenuto non comprensibile da una persona:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-14-at-10.22.15-PM.png" class="kg-image" alt="Screenshot-2021-03-14-at-10.22.15-PM" width="600" height="400" loading="lazy"></figure><h4 id="il-collegamento-in-c"><strong>Il collegamento in C</strong></h4><p>Nell'immagine qui sopra, potresti aver notato un file <code>a.out</code> nella nostra cartella.</p><p>Il file viene creato durante uno step di default quando digitiamo il comando del compilatore e il nome del file, <code>gcc hello.c</code> nel nostro caso.</p><p>Se usiamo il comando precedentemente menzionato <code>gcc -o hello hello.c</code>, vedremo un programma eseguibile con il nome personalizzato <code>hello</code> al posto di <code>a.out</code>.</p><p><code>a.out</code> sta per <em><em>assembly output</em></em>. Se scriviamo <code>ls</code> sul terminale per vedere l'elenco dei file nella nostra cartella, vedremo che <code>a.out</code> ha anche un aspetto diverso dagli altri:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-19-at-10.37.05-PM.png" class="kg-image" alt="Screenshot-2021-03-19-at-10.37.05-PM" width="600" height="400" loading="lazy"></figure><p>Il collegamento è il passaggio finale del processo di compilazione in cui il file finale in binario <code>hello.o</code> viene collegato con l'altro codice oggetto nel nostro progetto.</p><p>Quindi se ci sono altri file contenenti codice sorgente C (come file inclusi nel nostro programma che implementano librerie C già processate e compilate, o un altro file che abbiamo scritto oltre a <code>hello.c</code>, chiamato, ad esempio, <code>nomefile.c</code>), questo è il momento in cui il file oggetto <code>nomefile.o</code> verrà combinato con <code>hello.o</code> e gli altri codici oggetto, e risulteranno collegati tutti insieme.</p><p>Il risultato è un grande file eseguibile con il codice macchina combinato, <code>a.out</code> o <code>hello</code>, che rappresenta il nostro programma.</p><p>Dato che abbiamo finalmente terminato il processo di compilazione, il programma è nella sua forma finale e possiamo eseguire il file sulla nostra macchina scrivendo <code>./a.out</code>. Questo vuol dire 'eseguire il file <code>a.out</code> che è nella cartella di lavoro attuale', dato che <code>./</code> rappresenta la cartella in cui ci troviamo. Poi vedremo l'output del nostro programma sul terminale:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-19-at-10.18.20-PM.png" class="kg-image" alt="Screenshot-2021-03-19-at-10.18.20-PM" width="600" height="400" loading="lazy"></figure><p>Ogni volta che apportiamo dei cambiamenti al nostro file con il codice sorgente, dobbiamo ripetere il processo di compilazione dall'inizio per poter vedere le modifiche quando eseguiamo di nuovo il codice.</p><h2 id="come-scrivere-hello-world-in-c"><strong>Come scrivere Hello World in C</strong></h2><p><code>Hello world</code> è un programma estremamente semplice, ma scriverlo è una tradizione quando stai imparando a programmare in un nuovo linguaggio.</p><p>Se esegui con successo il tuo programma <code>Hello world</code>, sai che il tuo sistema è configurato correttamente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2022/08/image-8.png" class="kg-image" alt="image-8" width="600" height="400" loading="lazy"><figcaption><a href="https://en.wikipedia.org/wiki/File:Hello_World_Brian_Kernighan_1978.jpg">"Hello World!" by Brian Kernighan</a></figcaption></figure><p>Un programma <code>Hello world</code> contiene la sintassi di base del linguaggio:</p><pre><code class="language-c">#include&lt;stdio.h&gt;

int main(void)
{
    // stampa hello world sullo schermo
	printf("Hello world\n");
}
</code></pre><p>Nelle prossime sezioni analizzeremo le varie parti che lo compongono.</p><h3 id="i-file-di-intestazione-in-c"><strong>I File di intestazione in C</strong></h3><p>I file di intestazione sono librerie esterne, ovvero del codice già scritto da sviluppatori ad uso di altri sviluppatori.</p><p>Forniscono funzionalità che non sono incluse nel nucleo del linguaggio C. Aggiungendo i file di intestazione al codice, otteniamo funzionalità aggiuntive da utilizzare nei nostri programmi.</p><p>I file di intestazione come <code>include &lt;stdio.h&gt;</code> terminano con l'estensione <code>.h</code>. In particolare, un file di intestazione come <code>stdio.h</code> è già integrato nel compilatore.</p><p>La riga <code>include &lt;stdio.h&gt;</code> è un'istruzione per le funzioni contenute nella libreria <code>stdio.h</code>, &nbsp;che dice al computer di accedervi e includerle nel nostro programma.</p><p><code>stdio.h</code> ci dà le funzionalità <code>standard input</code> e <code>standard output</code>, grazie alle quali saremo in grado di ottenere input e fornire output agli utenti. Quindi, dovremmo imparare a usare funzioni di input/output come <code>printf</code>.</p><p>Se non includi il file <code>stdio.h</code> all'inizio del codice, il computer non comprenderà cos'è la funzione <code>printf</code>.</p><h3 id="il-programma-main-in-c"><strong>Il programma main in C</strong></h3><p>Ecco il codice:</p><pre><code class="language-c">int main(void)
{
}
</code></pre><p>Questa è la funzione principale di partenza in C. Le parentesi graffe (<code>{}</code>) sono il corpo che contiene tutto il codice che dovrebbe essere nel nostro programma.</p><p>Questa riga agisce come modello e punto di partenza per tutti i programmi in C. Fa sapere al computer dove iniziare a leggere il codice durante l'esecuzione dei programmi.</p><h3 id="commenti-in-c"><strong>Commenti in C</strong></h3><p>Tutto ciò che scriviamo dopo <code>//</code> non influenzerà l'esecuzione del nostro codice e non sarà preso in considerazione dal computer durante il tempo di compilazione ed esecuzione.</p><p>Le due sbarre indicano la presenza di un commento, ovvero una nota per noi e i nostri collaboratori. I commenti possono aiutarci a ricordare cosa fa una specifica riga di codice o perché si trova in quella posizione. Ci ricorda anche lo scopo preciso di una parte di codice quando torniamo a lavorarci su dopo un giorno o addirittura dopo alcuni mesi.</p><h3 id="ottenere-un-output-sulla-console-in-c"><strong>Ottenere un output sulla console in C</strong></h3><p><code>printf("Hello world/n");</code> stampa la frase 'Hello world' sulla console. Utilizziamo <code>printf</code> quando vogliamo scrivere qualcosa e vedere un output sullo schermo. I caratteri che fanno parte dell'output devono essere compresi tra virgolette doppie <code>""</code> e parentesi <code>()</code>.</p><p><code>/n</code> è un carattere di escape, che crea una nuova riga e comunica al cursore di muoversi a capo quando viene incontrato.</p><p><code>;</code> indica la fine della frase e la fine della riga di codice.</p><h2 id="variabili-in-c"><strong>Variabili in C</strong></h2><p>Ecco come definiamo una variabile in C:</p><blockquote><em>Un elemento di dati che può assumere uno o più valori durante il runtime di un programma<em>.</em></em></blockquote><p>In termini più semplici, puoi pensare a una variabile come una scatola con un nome. Una scatola che agisce come posto per immagazzinare diverse informazioni e il cui contenuto può variare.</p><p>Ogni scatola ha un nome unico, che ha la funzione di etichetta identificativa che ci informa sul contenuto della scatola. Il contenuto è il valore della variabile.</p><p>Le variabili contengono e puntano a un valore, a qualche dato utile. Agiscono come riferimento o astrazione per dati letterali. Questi dati sono conservati nella memoria del computer e occupano un certo spazio. Si trovano lì, così che possiamo recuperarli per usarli quando ne abbiamo bisogno più avanti nei nostri programmi.</p><p>Come suggerisce il nome, ciò a cui fa riferimento una variabile può variare. Le variabili sono in grado di assumere valori diversi nel tempo, in base alle informazioni che cambiano durante la vita del programma.</p><h3 id="assegnazione-delle-variabili-in-c"><strong>Assegnazione delle variabili in C</strong></h3><p>Il processo di dare un nome a una variabile si chiama assegnazione. Ciò avviene tramite l'uso dell'<em>operatore di assegnazione</em> <code>=</code>, impostando un valore specifico per un nome specifico, rispettivamente alla destra e alla sinistra dell'operatore.</p><p>Come già detto, puoi cambiare il valore della variabile, quindi puoi assegnare e riassegnare variabili. Quando riassegni un valore, il nuovo valore punta al nome della variabile. Quindi, il valore può cambiare, ma il nome della variabile resta invariato.</p><h3 id="come-dichiarare-e-inizializzare-una-variabile-in-c"><strong>Come dichiarare e inizializzare una variabile in C</strong></h3><p>A differenza di molti altri moderni linguaggi di programmazione, l'assegnazione dei tipi delle variabili in C segue una <strong>tipizzazione statica forte</strong>.</p><p>Nei linguaggi tipizzati staticamente, devi dichiarare esplicitamente il tipo di dato di una variabile. In questo modo, durante il tempo di compilazione, il compilatore conosce se una variabile è in grado di eseguire l'azione stabilita e richiesta.</p><p>Nei linguaggi <strong>tipizzati dinamicamente</strong>, una variabile può passare tra differenti tipi di dati senza bisogno di una definizione esplicita del tipo di dato.</p><p>Dunque, quando dichiariamo una nuova variabile in C, dobbiamo definire e specificare il tipo della variabile, ovvero il tipo del valore che contiene.</p><p>In questo modo, il programma e poi il compilatore conoscono la natura dell'informazione memorizzata.</p><p>Per dichiarare una variabile, devi <strong>specificare il tipo di dato e dare un nome alla variabile</strong>. Uno step opzionale è impostare un valore iniziale. Non dimenticare il punto e virgola alla fine, per terminare l'istruzione!</p><pre><code class="language-c">#include &lt;stdio.h&gt;
 
int main(void)
{
  int n = 27;
  // int è il tipo di dato
  // n è il nome 
  // n può contenere valori interi
  // numeri interi positivi/negativi o 0
  // = è l'operatore di assegnazione
  // 27 è il valore
}
</code></pre><p>Qual è la differenza tra inizializzare e dichiarare una variabile?</p><p>In sostanza:</p><pre><code class="language-c">int n; // dichiarazione: crea una variabile chiamata n in grado di contenere valori interi
int n = 27; // inizializzazione: crea una variabile chiamata n e assegna un valore, memorizzando il numero nella variabile
</code></pre><p><code>int n;</code> è la dichiarazione della variabile. Dichiarare vuol dire definire un nome per la variabile e specificarne il tipo.</p><p>Non dobbiamo necessariamente specificare un valore per la variabile, basta questo. Infatti, la dichiarazione comunica al computer che vogliamo che la variabile esista e abbiamo bisogno di assegnarle dello spazio in memoria. Il valore sarà immagazzinato in un secondo momento.</p><p>In seguito, quando assegniamo il valore alla variabile, non c'è bisogno di specificare di nuovo il tipo di dato. Possiamo anche dichiarare più variabili in un colpo solo.</p><pre><code class="language-c">int nome, età;
</code></pre><p>Se <strong>dichiariamo una variabile e le assegniamo contemporaneamente un valore, stiamo inizializzando la variabile</strong>.</p><p><code>int n = 27;</code> è l'inizializzazione della variabile. Vuol dire assegnare un valore iniziale che in seguito può essere cambiato.</p><p>Se il nuovo valore è dello stesso tipo di dato, non dobbiamo specificarlo. Se invece il tipo di dato è differente, otterremo un errore.</p><pre><code class="language-c">#include&lt;stdio.h&gt;

int main(void)
{
  int age = 27;
  age = 37;
  // il nuovo valore di age è 37
}
</code></pre><h3 id="nomenclatura-delle-variabili-in-c"><strong>Nomenclatura delle variabili in C</strong></h3><ul><li>I nomi delle variabili devono <em>iniziare</em> con una lettera o con un trattino basso. Ad esempio <code>age</code> e <code>_age</code> sono dei nomi validi.</li><li>Il nome di una variabile può <em>contenere </em>lettere (maiuscole o minuscole), numeri o un trattino basso.</li><li>Non possono esserci altri caratteri speciali oltre il trattino basso.</li><li>I nomi delle variabili sono <em><em>case sensitive</em></em>, quindi <code>age</code> è diverso <code>Age</code>.</li></ul><h3 id="visibilit-di-una-variabile-in-c"><strong>Visibilità di una variabile in C</strong></h3><p>La visibilità (scope) di una variabile fa riferimento a dove è possibile avere accesso alla variabile. È essenzialmente lo spazio in cui la variabile si trova ed è valida, e il modo in cui è vista dal resto del programma.</p><h4 id="visibilit-locale"><strong>Visibilità locale</strong></h4><p>Se una variabile viene dichiarata all'interno di un set di parentesi graffe, <code>{}</code>, come una specifica funzione, avrà una visibilità locale (local scope) e non sarà possibile avere accesso alla variabile nel resto del programma al di fuori delle parentesi. Il resto del programma non saprà che esiste.</p><p>Perciò, può non essere una buona idea dichiarare variabili in questo modo, in quanto la visibilità e l'utilizzo limitati possono generare degli errori.</p><h4 id="visibilit-globale"><strong>Visibilità globale</strong></h4><p>Se le variabili vengono dichiarate al di fuori delle funzioni, hanno una visibilità globale (global scope). Avere una visibilità globale vuol dire che vi si può accedere da ogni parte del programma.</p><p>Ma tieni a mente che può essere difficile tenerne traccia. Ogni cambiamento che facciamo strada facendo può confondere, dato che può avvenire in qualsiasi parte del programma.</p><h2 id="tipi-di-dati-in-c"><strong>Tipi di dati in C</strong></h2><p>I tipi di dati specificano in che forma possiamo rappresentare e immagazzinare un'informazione nel nostro programma in C. Ci permettono di conoscere come potrà essere utilizzata quell'informazione e le operazione che vi potranno essere eseguite.</p><p>I tipi di dati determinano anche quale può essere il contenuto di una variabile, dato che ogni variabile in C ha bisogno di una dichiarazione esplicita del tipo di dato.</p><p>Ci sono <strong>6</strong> tipi di dati integrati nel linguaggio, ma è possibile convertire tipi diversi. Ciò fa sì che il linguaggio non sia così fortemente tipizzato.</p><p>Ogni tipo di dato richiede una diversa assegnazione di memoria e può avere degli intervalli di valori validi differenti.</p><p>Aggiungere parole chiave prima del nome di un tipo di dato lo modifica. Queste parole chiave possono essere <em><em>unsigned</em></em> o <em><em>signed</em></em>.</p><p>La parola chiave <em>unsigned </em>sta a significare che il tipo può essere soltanto positivo e non negativo, mentre <em>signed </em>permette di avere un numero negativo o positivo.</p><p>Diamo un'occhiata più dettagliata a questi tipi di dati.</p><h3 id="il-tipo-di-dato-char-in-c"><strong>Il tipo di dato char in C</strong></h3><p>Il tipo di dato più semplice in C è <code>char</code>. Si utilizza per caratteri singoli come quelli della tabella ASCII come 'a', 'Z', o '!" (nota l'uso delle virgolette singole per circondare il carattere – non puoi utilizzare le virgolette doppie in questo caso).</p><p><code>char</code> ti permette anche di memorizzare i numeri da -128 a 127 e in entrambi i casi utilizza 1 byte di memoria.</p><p>Un <strong><strong>unsigned char</strong></strong> può assumere i valori da 0 a 255.</p><h3 id="il-tipo-di-dato-int-in-c"><strong>Il tipo di dato int in C</strong></h3><p><code>int</code> è un numero intero che può contenere un valore positivo o negativo o 0 senza decimali.</p><p>È un valore con un numero di bit limitato. Quando dichiari un <code>int</code>, il computer gli assegna 4 byte di memoria (più specificamente utilizza almeno 2 byte, ma di solito ne usa 4). 4 byte di memoria equivalgono a 32 bit (dato che 1 byte = 8 bit). Quindi un int ha 2<sup>32</sup> possibili valori – più di 4 miliardi di interi possibili.</p><p>L'intervallo va da -2<sup>31</sup> a 2<sup>31</sup>-1, più precisamente da -2,147,483,648 a 2,147,483,647.</p><ul><li>Un <strong><strong>unsigned int</strong></strong> ha ancora la stessa dimensione in memoria di un intero (4 bytes) ma non include i numeri negativi nell'intervallo dei valori possibili, che quindi va da 0 a 2<sup>32</sup>-1, più precisamente da 0 a 4,294,969,295</li><li>Uno <strong><strong>short int</strong></strong> ha un valore più piccolo di un int e occupa 2 byte di memoria. È compreso nell'intervallo da -32,768 a 32,767</li><li>Un <strong><strong>unsigned short int</strong></strong> occupa 2 byte di memoria e è compreso tra 0 e 65,535</li><li>Un <strong><strong>long int</strong></strong> è destinato a numeri grandi. Occupa <em>almeno</em> 4 byte di memoria, ma solitamente occupa 8 byte ed è compreso tra -2,147,483,648 e 2,147,483,647</li><li>Un <strong><strong>unsigned long int</strong></strong> occupa almeno 4 byte di memoria ed è compreso tra 0 e 4,294,967,295</li><li>Un <strong><strong>long long int</strong></strong> è un intero con più bit che è in grado di contenere numeri più grandi di un int o un long int. Occupa 8 byte (64 bit) invece di 4. Questo permette un intervallo più ampio, da -2<sup>63</sup> a 2<sup>63</sup>-1, più precisamente da -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807</li><li>Un <strong><strong>unsigned long long</strong></strong> utilizza 8 bytes e va da 0 a 18,446,744,073,709,551,615</li></ul><h3 id="il-tipo-di-dato-float-in-c"><strong>Il tipo di dato float in C</strong></h3><p>I float sono numeri con una parte decimale (anche detti numeri reali), con precisione singola, e occupano 4 byte di memoria.</p><h3 id="il-tipo-di-dato-double-in-c"><strong>Il tipo di dato double in C</strong></h3><p>Un double è un numero decimale con un valore maggiore di un float. Occupa più memoria rispetto a un float – 8 bytes – e ha precisione doppia.</p><ul><li>Un <strong><strong>long double</strong></strong> è di dimensione maggiore in confronto a un float e un double e occupa almeno 10 byte di memoria, fino a un massimo di 12 o 16 byte.</li></ul><p>Infine, il tipo di dato <strong><strong>void</strong> </strong>significa essenzialmente nessun valore.</p><h3 id="specificatori-di-formato-in-c"><strong>Specificatori di formato in C</strong></h3><p>Gli specificatori di formato vengono utilizzati per gli input e gli output in C.</p><p>Sono un modo per comunicare al compilatore che tipo di dato accetta una variabile come input e quale tipo di dato produce come output utilizzando la funzione <code>printf()</code>. La <code>f</code> in <code>printf()</code> sta per <em><em>forma</em>t<em>t</em>ato</em>.</p><p>Agiscono come un segnaposto per un formato di codice e sostituiscono le variabili. Fanno sapere in anticipo al compilatore di che tipo sono quando il valore dell'output standard (ovvero ciò che vogliamo stampare) non è ancora conosciuto.</p><p>La sintassi che usiamo è <code>% specificatore di formato per il tipo di dato</code>:</p><pre><code class="language-c">#include&lt;stdio.h&gt;
int main(void)
{
	int age = 27;
	printf("My age is %i/n", age)
	// stampa 27
// age è la variabile che vogliamo usare 
// %i è lo specificatore di formato, un segnaposto per un valore intero
// separiamo ogni argomento con una virgola
// nell'output %i  viene sostituito con il valore di age
}
</code></pre><p>Ci sono diversi specificatori di formato per ogni tipo di dato di cui abbiamo parlato precedentemente. Eccone alcuni:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">FORMAT SPECIFIER</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);">DATA TYPE</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%c</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">char</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%c</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">unsigned char</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%i</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">&amp;d</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%u</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">unsigned int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%hi</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%hd</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">short int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%hu</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">unsigned short int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%li</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%ld</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">long int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%lu</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">unsigned long int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%lli</code><span>&nbsp;</span>or<span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%lld</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">long long int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%llu</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">unsigned long long int</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%f</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">float</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%lf</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">double</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%Lf</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">long double</td></tr></tbody></table><!--kg-card-end: html--><h2 id="operatori-in-c"><strong>Operatori in C</strong></h2><h3 id="operatori-aritmetici-in-c"><strong>Operatori aritmetici in C</strong></h3><p>Gli operatori aritmetici sono operatori matematici che eseguono funzioni matematiche su dei numeri. Le operazioni includono l'addizione, la sottrazione, la moltiplicazione e la divisione.</p><p>Gli operatori utilizzati più di frequente sono:</p><ul><li><code>+</code> per l'addizione</li><li><code>-</code> per la sottrazione</li><li><code>*</code> per la moltiplicazione</li><li><code>/</code> per la divisione</li><li><code>%</code> per la divisione con modulo (restituisce il resto della divisione)</li></ul><h3 id="operatore-di-assegnazione-in-c"><strong>Operatore di assegnazione in C</strong></h3><p>L'operatore di assegnazione <code>=</code> assegna un valore a una variabile. In altre parole, imposta qualsiasi cosa si trovi sul lato destro di <code>=</code> come valore della variabile sul lato sinistro di <code>=</code>.</p><p>Esistono specifici operatori di assegnazione per aggiornare una variabile modificandone il valore.</p><p>In C, ci sono diversi modi per aggiornare il valore delle variabili. Ad esempio, se vogliamo incrementare il valore della variabile di <code>1</code>, abbiamo tre modi possibili per farlo.</p><p>Prima di tutto, vale la pena precisare che incrementare vuol dire prendere il valore attuale della variabile, qualsiasi valore sia sulla destra, e aggiungervi &nbsp;<code>1</code>. Il nuovo valore viene memorizzato nella variabile e aggiornato automaticamente.</p><p>Consideriamo di voler incrementare o aggiornare una variabile chiamata <code>x</code> con un valore iniziale di <code>5</code>:</p><p><code>x=5</code>.</p><p>Per aggiungere <code>1</code> alla variabile <code>x</code>, scriviamo &nbsp;<code>x = x + 1</code> che vuol dire <code>x = 5 + 1</code>.</p><p>Il nuovo valore di <code>x</code> adesso è <code>6</code>, <code>x=6</code>.</p><p>Esiste una scorciatoia per questa operazione, utilizzando una sintassi particolare che incrementa le variabili.</p><p>Invece di scrivere <code>x = x +1</code> scriviamo <code>x += 1</code>.</p><p>Un modo ancora più corto è utilizzare l'operatore di incremento, che segue la sintassi <code>nome_variabile ++</code>, quindi nel nostro caso <code>x ++</code>.</p><p>La stessa cosa vale per diminuire, ovvero decrementare, una variabile di <code>1</code>.</p><p>I tre modi per farlo sono rispettivamente:</p><p><code>x = x-1</code>, <code>x -= 1</code>, <code>x --</code> (usando l'operatore di decremento).</p><p>Questi sono i modi per incrementare e decrementare una variabile di <code>1</code> in C. Siamo in grado di aggiornare una variabile prendendo il suo valore e aggiungendo, sottraendo, moltiplicando e dividendo quel valore per un altro numero, e poi impostando il risultato dell'operazione come nuovo valore. Queste operazioni sono rispettivamente <code>+=</code>, <code>-=</code>, <code>*=</code> e <code>/=</code>.</p><p>Quindi con <code>x = x * 5</code> oppure con la scorciatoia <code>x *= 5</code> il valore della variabile <code>x</code> sarà moltiplicato per <code>5</code> e poi memorizzato in <code>x</code>.</p><h3 id="operatori-logici-in-c"><strong>Operatori logici in C</strong></h3><p>In C, utilizziamo gli operatori logici per prendere decisioni. Il risultato di questo tipo di operazioni può essere vero (<code>true</code>) o falso (<code>false</code>).</p><p>L'operatore logico <code>&amp;&amp;</code> (and) necessita che gli operandi posti sia al lato sinistro che al destro di <code>&amp;&amp;</code> siano veri affinché la condizione sia verificata.</p><p>L'operatore logico <code>||</code> (or) necessita che <em>almeno </em>uno degli operandi sul lato destro e sinistro di <code>||</code> sia vero affinché la condizione sia verificata.</p><p>Infine, l'operatore logico <code>!</code> (not) inverte il valore dell'operando. Se un operando è <code>true</code>, allora l'operatore <code>!</code> rende la condizione <code>false</code> e vice versa.</p><h3 id="operatori-di-confronto-in-c"><strong>Operatori di confronto in C</strong></h3><p>Gli operatori di confronto sono:</p><ul><li>Maggiore di <code>&gt;</code></li><li>Maggiore di o uguale a <code>&gt;=</code></li><li>Minore di <code>&lt;</code></li><li>Minore di o uguale a <code>=&lt;</code></li></ul><p>Esiste anche l'operatore di uguaglianza, <code>==</code>, da non confondere con <code>=</code>, l'operatore di assegnazione.</p><p>Usiamo <code>==</code> per confrontare due valori e testare che siano uguali oppure no. Questo operatore pone la domanda 'Questi due elementi sono uguali?', mentre <code>=</code> assegna un valore a una variabile.</p><p>Utilizzando l'operatore di uguaglianza (che pone la domanda qui sopra) c'è sempre un valore di ritorno che può essere <code>true</code> o <code>false</code>. Questi ultimi sono conosciuti nel mondo della programmazione come valori booleani.</p><p>Infine, abbiamo l'operatore di disuguaglianza, <code>!=</code>, utilizzato per verificare se due valori non sono uguali.</p><h2 id="funzioni-in-c"><strong>Funzioni in C</strong></h2><p>Le funzioni sono parti di codice che svolgono piccole azioni. Eseguono un compito specifico.</p><p>Incorporano una parte di un processo che è pensato per essere ripetuto più volte. Lo scopo delle funzioni è di avere un certo procedimento scritto soltanto una volta, così da poterlo riutilizzare all'occorrenza, più volte e in posti differenti all'interno di un programma. In questo modo, il codice diventa più semplice e meglio organizzato.</p><p>Le funzioni hanno uno scopo particolare, esistono per eseguire un compito ed essere riutilizzate, accettando degli input per restituire degli output.</p><h3 id="argomenti-di-funzioni-in-c"><strong>Argomenti di funzioni in C</strong></h3><p>Gli input che una funzione accetta sono detti argomenti. Una funzione può avere uno o più argomenti.</p><p>Una funzione comune nel linguaggio C è <code>printf();</code>, che stampa qualcosa sullo schermo. È una funzione usata per dire qualcosa.</p><p>Le parentesi <code>()</code> accolgono l'input della funzione. Al loro interno vanno gli argomenti – ovvero, ciò che vogliamo effettivamente dire e stampare sullo schermo, quindi quello che si trova tra le parentesi viene stampato.</p><p>In <code>printf("Hello world!");</code>, <code>Hello world!</code> è l'input della funzione <code>printf</code>. Qui, stiamo chiamando la funzione chiamata <code>printf</code> e le stiamo dando come argomento una stringa, dicendo specificatamente di stampare sullo schermo 'Hello world!'.</p><h3 id="output-di-funzioni-in-c"><strong>Output di funzioni in C</strong></h3><p>Esistono due tipi di output di funzioni:</p><ul><li>I primi sono output visuali, con un effetto immediato, qualcosa che viene stampato velocemente sullo schermo.<br>Non puoi fare altro con questi output in seguito al loro effetto. Come nel caso di <code>printf("Hello world!");</code>, la stringa di output "Hello world!" viene stampata sullo schermo, e fine. Non puoi usare quella stringa in un altro modo, perché <code>printf</code> non ha un valore di ritorno.<br>Questi tipi di funzioni sono conosciuti come <em>effetti collaterali</em>, nel senso che hanno un effetto osservabile immediato senza restituire un valore.<br>Inoltre, una funzione come <code>printf</code> è un'invocazione di funzione e nella libreria <code>stdio</code> è definita come <code>int printf(const char *format,...);</code>.</li><li>I secondi sono riutilizzabili, in quanto sono dei valori di ritorno. Un valore di ritorno è un valore restituito al programmatore e conservato in una variabile per essere utilizzato in un secondo momento.<br>In questo caso, l'effetto non è immediato – non viene stampato nulla sullo schermo. L'output ci viene restituito, conservato come informazione e salvato in una variabile.</li></ul><h2 id="come-definire-un-metodo-in-c"><strong>Come definire un metodo in C</strong></h2><p>Ci sono tre cose che hai bisogno di avere nella prima riga, la riga di dichiarazione, quando definisci una funzione.</p><ol><li><strong>Il tipo del valore di ritorno</strong><br>Questa è la prima parola chiave utilizzata e appena la funzione inizia indica il valore di ritorno.<br>Ad esempio, in una funzione come <code>void say_something(void)</code>, il primo void vuol dire che la funzione non ha valore di ritorno.<br>In un altro esempio con una funzione diversa, <code>int main(void)</code>, specifichiamo e definiamo il tipo del valore di ritorno come <code>int</code>. L'output della funzione sarà un dato di tipo <code>int</code> e sarà restituito quando la funzione è invocata.</li><li><strong>Il nome della funzione</strong><br>Il nome può essere qualsiasi cosa, tuttavia è una buona pratica chiamare i metodi con dei nomi pertinenti alle azioni che svolgono.</li><li><strong>Nessuno, uno o più argomenti</strong><br>Sono gli input della funzione e il tipo di dati degli input.<br>In <code>void say_something(void)</code>, il <code>void</code> tra parentesi è una parola chiave per l'argomento e un segnaposto per "niente". Significa che la funzione non accetta input. In casi come questo, l'argomento è anche detto <em>parametro</em>.<br>I parametri sono essenzialmente variabili dichiarate nella funzione, all'interno delle parentesi come la parola chiave <code>void</code>. Agiscono come segnaposto per accedere ai dati di input della funzione, gli argomenti.<br>I parametri fanno riferimento al valore che viene passato al metodo. Ciò vuol dire che quando chiamiamo la funzione in un secondo momento, le passiamo il valore reale, ovvero l'argomento.</li></ol><h2 id="come-chiamare-una-funzione-in-c"><strong>Come chiamare una funzione in C</strong></h2><p>Possiamo chiamare una funzione come:</p><pre><code class="language-c">void say_hi(void)
{
	printf("hello");
}
</code></pre><p>scrivendo il nome della funzione seguito dagli argomenti tra parentesi e un punto e virgola, come <code>say_hi();</code>. La funzione <code>say_hi</code> non accetta input e non ha un valore di ritorno. La invochiamo solo per stampare 'hello' sullo schermo.</p><p>Un'altra funzione come:</p><pre><code class="language-c">int square(int n)
{
	return n * n
}
</code></pre><p>viene chiamata nello stesso modo dell'esempio precedente. In questo caso, la funzione <code>square</code> accetta un input e ha un valore di ritorno (sono entrambi <code>int</code>). L'input che prende è il parametro chiamato <code>n</code>, che restituisce un <code>int</code> quando la funzione è invocata.</p><p>La parola <code>return</code> specifica quello che sarà restituito, l'input <code>n</code> moltiplicato per sé stesso.</p><p>Ad esempio, quando la funzione è chiamata con <code>square(3);</code>, <code>n</code> agisce come una variabile che punta al parametro che è stato passato alla funzione, cioè <code>3</code>. È come se avessimo impostato <code>n = 3</code>, e il valore restituito è <code>9</code>.</p><p>Le funzioni sono pensate per essere riutilizzate, quindi la possiamo usare ogni volta che vogliamo il quadrato di un numero:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

  int square(int x)
  {
    return x * x;
  }
 
  int main(void)
  {
   printf("%i\n", square(2));
   printf("%i\n", square(4));
   printf("%i\n", square(8));
 }
</code></pre><h2 id="come-usare-le-espressioni-booleane-in-c"><strong>Come usare le espressioni booleane in C</strong></h2><p>Un'espressione booleana è un'espressione il cui valore può essere <code>true</code> o <code>false</code>. Queste espressioni prendono il loro nome dal matematico, filosofo e logico George Boole.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/Screenshot-2021-06-18-at-1.58.33-PM.png" class="kg-image" alt="Screenshot-2021-06-18-at-1.58.33-PM" width="600" height="400" loading="lazy"><figcaption><a href="https://commons.wikimedia.org/wiki/File:George_Boole_color.jpg" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">George Boole</a> Image Source Wikimedia</figcaption></figure><p>Usiamo le espressioni booleane per confrontare due valori, e sono particolarmente utili nelle strutture di controllo.</p><p>Ogni valore diverso da <code>0</code> è <code>true</code> e <code>0</code> è <code>false</code>.</p><p>Possiamo combinare espressioni booleane con l'uso di operatori logici differenti, come <code>&amp;&amp;</code> (and), <code>||</code> (or) e <code>!</code> (not) di cui abbiamo parlato precedentemente.</p><p>Combinazioni differenti di valori e operatori portano a diversi risultati di output, che possono essere riassunti in una <em>tabella della verità</em>, una tabella matematica usata per rappresentare equazioni logiche il cui risultato è <code>1</code> o <code>0</code>, o il loro equivalente <code>true</code> o <code>false</code>.</p><p>Quando confrontiamo due valori booleani usando l'operatore <code>&amp;&amp;</code> (and), entrambi i valori devono essere veri affinché lo sia anche l'espressione combinata.</p><p>Ad esempio, se qualcuno ci chiede "Vuoi una pizza <em>e</em> dell'insalata?", l'unico modo per cui l'espressione sia vera è che noi vogliamo <em>entrambi </em>i cibi (quindi che la nostra risposta sia <em>sì</em> per tutti e due). Se la risposta per uno dei due non è valutata come <code>true</code>, allora l'espressione combinata è <code>false</code>.</p><p><strong>Tabella della verità per<strong> &amp;&amp;</strong></strong></p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">VALUE A</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);">VALUE B</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">RESULT</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td></tr></tbody></table><!--kg-card-end: html--><p>A differenza di <code>&amp;&amp;</code>, l'operatore <code>||</code> non è esclusivo e l'espressione combinata viene valutata come vera se una o entrambe le espressioni sono vere.</p><p>Considerando la precedente domanda di esempio "Vuoi una pizza <em>e</em> dell'insalata?", se cambiamo l'operatore AND con OR, non significa che vogliamo entrambi i cibi. Possiamo volerne uno o l'altro e non necessariamente entrambi. </p><p><strong>Tabella della verità per<strong> ||</strong></strong></p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">VALUE A</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);">VALUE B</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">RESULT</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">false</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">false</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; text-align: center;">true</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: left;">true</td></tr></tbody></table><!--kg-card-end: html--><p>Infine, l'operatore <code>!</code> (not) viene usato per le negazioni. Ciò vuol dire che cambia <code>true</code> in <code>false</code> e <code>false</code> in <code>true</code>.</p><pre><code>!true is false
!false is true
</code></pre><h2 id="come-usare-le-istruzioni-condizionali-in-c"><strong>Come usare le istruzioni condizionali in C</strong></h2><p>Le istruzioni condizionali svolgono un'azione specifica in base al risultato di un'operazione di confronto. Sono dette <em>strutture di controllo</em>, poiché sono dei costrutti che governano il flusso di esecuzione, definendo lo svolgimento di un'azione nel caso una condizione sia vera, ed eventualmente un'azione differente nel caso sia falsa. </p><p>Alcune parti di un programma possono non essere eseguite a seconda di un risultato o di un certo input dell'utente. L'utente può percorrere diverse strade con varie biforcazioni durante la vita del programma.</p><p>I programmi con istruzioni condizionali sfruttano principalmente dei blocchi <code>if</code>. I blocchi <code>if</code> usano espressioni booleane che possono essere <code>true</code> o <code>false</code>, e "prendono decisioni" a seconda dei valori risultanti. Denotiamo il blocco di un'istruzione <code>if</code> usando le parentesi graffe, <code>{}</code>, e indentando il codice come segue.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
int main(void)
{
int x = 2;
int y = 3;

if (x &lt; y)
 
// x &lt; y è un'espressione booleana, può essere solo true o false.
// Se tutto ciò che è nelle parentesi è true 
// -in questo caso x è effettivamente minore di y-
// viene eseguito il seguente codice
{
	printf("x è minore di y"); 

// Poiché x &lt; y è true, la frase verrà stampata sulla console
}

}

</code></pre><p>Un'istruzione <code>if</code> da sola non è particolarmente utile, soprattutto se il programma cresce sempre di più. In questo caso, l'istruzione <code>if</code> è accompagnata dall'istruzione <code>else</code>.</p><p>Il codice qui sotto si comporta in questo modo: se la condizione di <code>if</code> è <code>true</code> viene eseguito il blocco corrispondente, altrimenti viene eseguito il blocco <code>else</code>. La parola chiave <code>else</code> è la soluzione per il caso in cui la condizione di <code>if</code> è falsa e quindi il codice correlato non viene eseguito. </p><pre><code class="language-c">int main(void)
{ 
int  x = 1;
int  y = 2;

if ( x &gt; y)
{
  printf("x è maggiore di y");
}

else 

{  
  printf("x è minore di y");
// Poiché  x &gt; y è false ,
// Questo blocco di codice viene eseguito
// e viene stampata sullo schermo la frase del ramo else
}

}
</code></pre><p>Se desideriamo scegliere tra più di due opzioni e vogliamo una varietà maggiore di istruzioni e azioni, possiamo introdurre una condizione <code>else if</code>.</p><p>Il codice qui sotto si comporta in questo modo: se la condizione è <code>true</code> viene eseguito il primo corrispondente, in caso contrario viene valutata la condizione del blocco <code>else if</code>. Se è <code>true</code> il blocco viene eseguito, altrimenti viene eseguito il blocco <code>else</code>.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
int main(void)
{
  int x = 2;
  int y = 2;

  if(x &lt; y)
   // Se la condizione è true esegui questo blocco
  {
    printf("x è minore di y");
  }
 else if(x &gt; y)
  // Se invece questa condizione è true esegui questo blocco
 { 
    printf("x è maggiore di y");
 } 
 else  
   // Se questo blocco di codice viene eseguito  
   // è perché x &lt; y è false 
  // e anche x &gt; y è false
  // il che vuol dire che x == y
 {
    printf("x è uguale a y");
 }
}
</code></pre><h2 id="come-usare-i-loop-in-c"><strong>Come usare i loop in C</strong></h2><p>Un loop è un insieme specifico di istruzioni che sono ripetute un certo numero di volte, fino a che una certa condizione viene raggiunta. Si tratta di una stessa azione, uno stesso codice ripetuto ancora e ancora.</p><h3 id="loop-while-in-c"><strong>Loop while in C</strong></h3><p>Prima di eseguire qualsiasi codice, i loop while devono valutare una condizione. Se la condizione è verificata, il codice viene eseguito. In caso contrario, il codice non partecipa all'azione. Quindi, l'esecuzione del codice non è garantita neanche una volta se la condizione non si verifica.</p><p>Esistono diversi tipi di loop while, e uno di questi è il loop infinito.</p><pre><code>#include &lt;stdio.h&gt; 
int main(void)
{

	while(true)
	{
		printf("Hello world");
	}
}
</code></pre><p>La parola chiave <code>while</code> è usata insieme all'espressione booleana, in questo caso <code>true</code> (che resta sempre <code>true</code>).</p><p>Dopo aver stampato la riga di codice all'interno delle parentesi graffe, la condizione viene rivalutata per sapere se eseguire ancora il corpo del loop. La risposta è sempre sì (dato che la condizione resta <code>true</code> ogni volta), così che l'esecuzione del loop continua indefinitamente.</p><p>In quest'esempio, l'unico modo per fermare il programma e uscire da questo loop senza fine è con il comando <code>Ctrl + C</code> dal terminale.</p><p>Se invece la condizione fosse stata <code>false</code>, il codice all'interno delle parentesi graffe non sarebbe mai stato eseguito.</p><p>Un altro loop, è quello che ripete qualcosa un certo numero di volte.</p><pre><code class="language-c">#include &lt;stdio.h&gt;
int main(void)
{
	int i = 0;

	while(i &lt; 10)
	{
	// Quando i è minore di 10 esegui questo codice
		printf("Hello world");
	// e poi incrementa i
		i++
	// valuta la condizione ogni volta
  // una volta eseguito il codice tra le parentesi graffe, valuta se i è ancora minore di 10.
  // In questo caso esegui il codice, incrementa e poi valuta ancora
	// Il loop terminerà quando i eguaglia 10
	}
}
</code></pre><h3 id="loop-do-while"><strong>Loop do-while</strong></h3><pre><code>#include &lt;stdio.h&gt;
 
int main(void)
 {
   int i = 10;
   do {
      printf("the value of i: %i\n", i);
      i++;
   }
  while( i &lt; 20 );
}
</code></pre><p>In confronto a un loop <code>while</code>, l'esecuzione di un loop <code>do- while</code> è garantita <em>almeno una volta</em>.</p><p>Compie prima un'azione e poi valuta la condizione. Può essere utile se vogliamo ripetere qualcosa per un certo numero di volte, e almeno una volta.</p><p>Nel nostro esempio, il codice viene eseguito almeno una volta e la frase viene stampata almeno una volta. Poi, il valore viene incrementato e viene valutato che sia minore di 20. In tal caso, il codice è eseguito nuovamente. Il loop termina una volta che il valore incrementato ogni volta non è più minore di 20.</p><h2 id="conclusione">Conclusione </h2><p>Siamo arrivati alla fine di questa introduzione al linguaggio di programmazione C! Spero di averti dato l'infarinatura necessaria a comprendere i fondamenti di C e per iniziare a scrivere dei programmi di base in questo linguaggio.</p><p>Grazie per aver letto questo articolo.<br>Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Loop for in C con esempi di codice ]]>
                </title>
                <description>
                    <![CDATA[ Se hai bisogno di ripetere un blocco di codice più volte, puoi utilizzare dei loop. Queste ripetizioni dello stesso blocco di codice, per un certo numero di volte, sono dette iterazioni e il numero delle iterazioni viene determinato dalla condizione del loop. I loop for e while sono ampiamente utilizzati ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/loop-for-in-c-con-esempi-di-codice/</link>
                <guid isPermaLink="false">62c5aed77e58e706f822d7cc</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Mon, 11 Jul 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/07/for.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/for-loops-in-c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">For Loops in C – Explained with Code Examples</a>
      </p><p>Se hai bisogno di ripetere un blocco di codice più volte, puoi utilizzare dei loop.</p><p>Queste ripetizioni dello stesso blocco di codice, per un certo numero di volte, sono dette <em>iterazioni</em> e il numero delle iterazioni viene determinato dalla condizione del loop.</p><p>I loop <code>for</code> e <code>while</code> sono ampiamente utilizzati in quasi tutti i linguaggi di programmazione.</p><p>In questo tutorial, parleremo dei loop <code>for</code> in C. In particolare, imparerai:</p><ul><li>la sintassi per usare i loop <code>for</code></li><li>come funzionano i loop <code>for</code> in C</li><li>l'eventualità di creare loop <code>for</code> infiniti</li></ul><p>Iniziamo!</p><h2 id="sintassi-e-funzionamento-dei-loop-for-in-c"><strong>Sintassi e funzionamento dei loop <code>for</code> in C</strong></h2><p>In questa sezione, imparerai la sintassi di base dei loop <code>for</code> in C.</p><p>La sintassi generale per usare un loop <code>for</code> è mostrata di seguito:</p><pre><code>for(initialize; check_condition; update)
    {
        //esegui questo
    }</code></pre><p>Nel blocco qui sopra:</p><ul><li><code>initialize</code> è l'istruzione di inizializzazione – qui viene inizializzata la variabile di controllo del loop.</li><li><code>check_condition</code> è la condizione che determina se il loop deve continuare.</li></ul><blockquote>Finché <code>check_condition</code> risulta vera<em><em>, </em></em>il corpo del loop viene eseguito.</blockquote><ul><li>L'istruzione <code>update</code> aggiorna la variabile di controllo del loop dopo l'esecuzione delle istruzioni nel corpo del loop.</li></ul><h3 id="struttura-di-controllo-dei-loop-for-in-c"><strong>Struttura di controllo dei loop <code>for</code> in C</strong></h3><p>La struttura di controllo è la seguente:</p><ol><li>Inizializzazione del conteggio – l'istruzione <code>initialize</code> viene eseguita. Questo accade solo una volta, all'inizio del loop.</li><li>Verifica della condizione del loop – viene valutata l'espressione <code>check_condition</code>. Se la condizione è <em><em>true</em></em>, si passa allo step 3. Se è <em><em>false</em></em>, si esce dal loop.</li><li>Esecuzione delle istruzioni nel corpo del loop.</li><li>Aggiornamento del conteggio – viene eseguita l'istruzione <code>update</code>.</li><li>Si torna allo step 2.</li></ol><p>Tutto ciò è illustrato qui sotto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-66.png" class="kg-image" alt="image-66" width="600" height="400" loading="lazy"><figcaption>Loop for in C</figcaption></figure><p>Ora che hai un'idea di come funziona un loop <code>for</code>, prendiamo un esempio semplice per vedere un loop <code>for</code> in azione.</p><h3 id="esempio-di-loop-for-in-c"><strong>Esempio di loop <code>for</code> in C</strong></h3><p>Scriviamo un semplice loop <code>for</code> per contare fino a 10 e stampare il valore del conto durante ogni passaggio attraverso il loop.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() 
{
   for(int count = 0; count &lt;= 10; count++)
   {
       printf("%d\n",count);
   }
   return 0;
}</code></pre><p>Nel blocco di codice qui sopra:</p><ul><li><code>count</code> è la variabile contatore ed è inizializzata a <code>0</code>.</li><li>La condizione del loop è <code>count &lt;= 10</code>. Dunque, <code>count</code> può essere al massimo 10 affinché il loop continui.</li><li>Nel corpo del loop, viene stampato il valore di <code>count</code>.</li><li>E il valore di <code>count</code> viene aumentato di 1.</li><li>Il controllo poi raggiunge la condizione <code>count &lt;= 10</code> e le iterazioni proseguono finché la condizione risulta verificata.</li><li>In quest'esempio, la condizione del loop <code>count &lt; = 10</code> diventa<em><em> false</em></em> quando il valore di <code>count</code> è 11 – e il loop termina.</li></ul><p>Ed ecco l'output:</p><pre><code>//Output
0
1
2
3
4
5
6
7
8
9
10</code></pre><p>Dovresti sempre fare attenzione che il tuo loop termini effettivamente ad un certo punto.</p><blockquote>Sai che il loop continua finché la condizione <code>check_condition</code> è <em><em>true</em>, mentre si ferma quando</em> <code>check_condition</code> diventa <em><em>false</em></em>. <em>Ma cosa accade se la condizione del loop è sempre<em> true</em></em>?</blockquote><p>Bene, questo è ciò che accade se ti imbatti in un loop infinito. Il loop prosegue per sempre, finché il programma non va in crash o il tuo sistema si spegne.😢</p><p>Imparerai di più sui loop infiniti nella prossima sezione.</p><h2 id="loop-for-infiniti"><strong>Loop <code>for</code> infiniti</strong></h2><p>Se il tuo loop non si ferma e continua ad oltranza, allora, hai un loop infinito. Facciamo qualche esempio per capire meglio.</p><p>▶ Nella costruzione del loop <code>for</code>, se non specifichi la condizione del loop (<code>check_condition</code>), viene assunta come <em><em>true </em></em>di default.</p><p>Come risultato, la condizione non diventa mai falsa e il loop continua a iterare indefinitamente fino a che non interrompi forzatamente il programma.</p><p>Ecco un loop infinito nello snippet di codice qui sotto:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    
    for(int i = 0; ; i++) //la condizione di test non è indicata
    {
        printf("%d ",i);
    }
    
    return 0;
}
</code></pre><p>▶ Vediamo un altro esempio.</p><p>Inizializzi la variabile contatore <code>i</code> a 10. Aumenti <code>i</code> di 1 dopo ogni iterazione.</p><p>Nota che la condizione di test è <code>i &gt; 0</code>, ma il valore di <code>i</code> sarà sempre maggiore di 0.</p><p>Quindi, otterrai un loop infinito:</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    
    for(int i = 10; i &gt; 0 ; i++) //la condizione di test è sempre TRUE
    {
        printf("%d ",i);
    }
    
    return 0;
}
</code></pre><p>▶ In quest'esempio, la variabile contatore <code>i</code> è inizializzata a <code>0</code>, ma decresce di 1 a ogni iterazione.</p><p>Di conseguenza, <code>i</code> sarà sempre minore di 10, &nbsp;la condizione <code>i &lt; 10</code> risulterà <em>sempre<em> true</em></em> e il loop sarà infinito.</p><pre><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    
    for(int i = 0; i &lt; 10 ; i--) //la condizione di test è sempre TRUE
    {
        printf("%d",i);
    }
    
    return 0;
}</code></pre><p>Per evitare di eseguire loop infiniti, dovresti definire correttamente la condizione del loop.</p><p>Se sei un principiante, porti queste domande potrebbe aiutarti:</p><blockquote>Cosa voglio che faccia questo loop?<br>Quante volte voglio che il loop venga eseguito?<br>Quando dovrebbe fermarsi?</blockquote><p>Poi, puoi proseguire e costruire il tuo loop di conseguenza. 🙂</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Spero che questo tutorial ti sia stato d'aiuto.</p><p>Per ricapitolare, abbiamo imparato la sintassi e il funzionamento dei loop <code>for</code>. Abbiamo anche anticipato la possibilità di definire dei loop <code>for</code> infiniti e parlato di come evitarli, definendo la condizione di loop con attenzione.</p><p>Ci vediamo presto per un altro tutorial. Fino ad allora, buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ L'operatore ternario in C ]]>
                </title>
                <description>
                    <![CDATA[ I programmatori usano l'operatore ternario per prendere decisioni al posto delle più lunghe espressioni condizionali if ed else. L'operatore ternario accetta tre argomenti:  1. Il primo è l'argomento di comparazione  2. Il secondo è il risultato per una comparazione vera  3. Il terzo è il risultato per ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/operatore-ternario-in-c/</link>
                <guid isPermaLink="false">62a6f781a3647806dd4ed55c</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ilenia Magoni ]]>
                </dc:creator>
                <pubDate>Wed, 15 Jun 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/06/5f9c9db2740569d1a4ca3922.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/c-ternary-operator/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Ternary Operator in C Explained</a>
      </p><p>I programmatori usano l'<strong>operatore ternario</strong> per prendere decisioni al posto delle più lunghe espressioni condizionali <strong>if</strong> ed <strong>else</strong>.</p><p>L'operatore ternario accetta tre argomenti:</p><ol><li>Il primo è l'argomento di comparazione</li><li>Il secondo è il risultato per una comparazione vera</li><li>Il terzo è il risultato per una comparazione falsa</li></ol><p>Potresti pensare all'operatore ternario come a un modo breve per scrivere una espressione if-else. Ecco un piccolo esempio decisionale usando <strong>if</strong> e <strong>else</strong>:</p><pre><code class="language-c">int a = 10, b = 20, c;

if (a &lt; b) {
    c = a;
}
else {
    c = b;
}

printf("%d", c);</code></pre><p>Questo esempio occupa più di 10 righe, ma non è necessario che sia così lungo. Puoi scrivere questo programmino in tre righe di codice usando un operatore ternario.</p><h3 id="sintassi">Sintassi</h3><pre><code class="language-C">condizione ? valore_se_vero : valore_se_falso</code></pre><p>L'espressione diventa <code>valore_se_vero</code> se <code>condizione</code> è vera, e <code>valore_se_falso</code> altrimenti.</p><p>Ecco l'esempio sopra riscritto usando l'operatore ternario:</p><pre><code class="language-c">int a = 10, b = 20, c;

c = (a &lt; b) ? a : b;

printf("%d", c);</code></pre><p>L'output dell'esempio sarà:</p><pre><code class="language-c">10</code></pre><p><code>c</code> prende il valore di <code>a</code>, perché la condizione <code>a &lt; b</code> è vera.</p><p>Ricorda che gli argomenti <code>valore_se_vero</code> e <code>valore_se_falso</code> devono essere dello stesso tipo e possono essere solo espressioni semplici.</p><p>Gli operatori ternari possono essere annidati proprio come le espressioni if-else. Considera il seguente codice:</p><pre><code class="language-c">int a = 1, b = 2, ans;
if (a == 1) {
    if (b == 2) {
        ans = 3;
    } else {
        ans = 5;
    }
} else {
    ans = 0;
}
printf ("%d\n", ans);</code></pre><p>Ecco il codice sopra riscritto usando un operatore ternario annidato:</p><pre><code class="language-c">int a = 1, b = 2, ans;
ans = (a == 1 ? (b == 2 ? 3 : 5) : 0);
printf ("%d\n", ans);</code></pre><p>L'output di entrambi i codici qui sopra è:</p><pre><code class="language-c">3</code></pre> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Definitori di formato in C ]]>
                </title>
                <description>
                    <![CDATA[ Gli identificatori di formato definiscono il tipo di dati da stampare sull'output standard. È necessario utilizzare gli identificatori di formato sia che si stampi l'output formattato con printf() e sia che si accetti l'input con  scanf(). Alcuni degli identificatori % che puoi utilizzare in ANSI C sono i seguenti: ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/definitori-di-formato-in-c/</link>
                <guid isPermaLink="false">621cddacb6d677050431905c</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Angelo Mirabelli ]]>
                </dc:creator>
                <pubDate>Fri, 04 Mar 2022 09:08:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/02/5f9c9d9c740569d1a4ca38a4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/format-specifiers-in-c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Format Specifiers in C</a>
      </p><p>Gli identificatori di formato definiscono il tipo di dati da stampare sull'output standard. È necessario utilizzare gli identificatori di formato sia che si stampi l'output formattato con <code>printf()</code> e sia che si accetti l'input con <code>scanf()</code>.</p><p>Alcuni degli identificatori % che puoi utilizzare in ANSI C sono i seguenti:</p><!--kg-card-begin: html--><table style="
    box-sizing: inherit;
    margin: 0.5em 0px 2.5em;
    padding: 0px;
    border: 0px;
    font-style: inherit;
    font-variant: inherit;
    font-weight: inherit;
    font-stretch: inherit;
    line-height: inherit;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
      Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
    font-size: 1.6rem;
    vertical-align: top;
    border-spacing: 0px;
    border-collapse: collapse;
    display: inline-block;
    overflow-x: auto;
    max-width: 100%;
    width: auto;
    white-space: nowrap;
    background: radial-gradient(
          at left center,
          rgba(0, 0, 0, 0.2) 0px,
          rgba(0, 0, 0, 0) 75%
        )
        0px center / 10px 100% no-repeat scroll,
      radial-gradient(
          at right center,
          rgba(0, 0, 0, 0.2) 0px,
          rgba(0, 0, 0, 0) 75%
        )
        100% center / 10px 100% scroll;
  ">
  <thead style="
      box-sizing: inherit;
      margin: 0px;
      padding: 0px;
      border: 0px;
      font-style: inherit;
      font-variant: inherit;
      font-weight: inherit;
      font-stretch: inherit;
      line-height: inherit;
      font-family: inherit;
      font-size: 16px;
      vertical-align: baseline;
    ">
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <th style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: 700;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 1.2rem;
          vertical-align: baseline;
          color: var(--gray85);
          letter-spacing: 0.2px;
          text-align: left;
          text-transform: uppercase;
          background-color: var(--gray10);
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">SPECIFICATORE</font></font>
      </th>
      <th style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: 700;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 1.2rem;
          vertical-align: baseline;
          color: var(--gray85);
          letter-spacing: 0.2px;
          text-align: left;
          text-transform: uppercase;
          background-color: var(--gray10);
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">USATO PER</font></font>
      </th>
    </tr>
  </thead>
  <tbody style="
      box-sizing: inherit;
      margin: 0px;
      padding: 0px;
      border: 0px;
      font-style: inherit;
      font-variant: inherit;
      font-weight: inherit;
      font-stretch: inherit;
      line-height: inherit;
      font-family: inherit;
      font-size: 16px;
      vertical-align: baseline;
    ">
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%c</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un unico carattere</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%s</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">una stringa</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%hi</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">short (con segno)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%hu</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">short (senza segno)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%Lf</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">long double</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%n</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">non stampa nulla</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%d</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un intero decimale (si assume base 10)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%i</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un numero intero decimale (rileva automaticamente la base)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%o</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un intero ottale (in base 8).</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%x</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un intero esadecimale (base 16)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%p</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un indirizzo (o puntatore)</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%f</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un numero in virgola mobile per i float</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%u</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">int decimale senza segno</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%e</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un numero in virgola mobile in notazione scientifica</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%E</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">un numero in virgola mobile in notazione scientifica</font></font>
      </td>
    </tr>
    <tr style="
        box-sizing: inherit;
        margin: 0px;
        padding: 0px;
        border: 0px;
        font-style: inherit;
        font-variant: inherit;
        font-weight: inherit;
        font-stretch: inherit;
        line-height: inherit;
        font-family: inherit;
        font-size: 16px;
        vertical-align: baseline;
      ">
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to right,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">%%</font></font>
      </td>
      <td style="
          box-sizing: inherit;
          margin: 0px;
          padding: 6px 12px;
          border: var(--gray10) 1px solid;
          font-style: inherit;
          font-variant: inherit;
          font-weight: inherit;
          font-stretch: inherit;
          line-height: inherit;
          font-family: inherit;
          font-size: 16px;
          vertical-align: baseline;
          background-image: linear-gradient(
            to left,
            rgb(255, 255, 255) 50%,
            rgba(255, 255, 255, 0) 100%
          );
          background-position: 100% 0px;
          background-size: 20px 100%;
          background-repeat: no-repeat;
        ">
        <font style="box-sizing: inherit; vertical-align: inherit"><font style="box-sizing: inherit; vertical-align: inherit">il simbolo %</font></font>
      </td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html--><h2 id="esempi-"><strong><strong>Esempi:</strong></strong></h2><h3 id="identificatore-di-formato-a-carattere-singolo-c-"><strong>I<strong>dentificatore di formato a carattere singolo</strong> <strong><code>%c</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char first_ch = 'f'; 
  printf("%c\n", first_ch); 
  return 0; 
} </code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>f</code></pre><h3 id="identificatore-di-formato-stringa-s-"><strong>I<strong>dentificatore di formato stringa</strong> <strong><code>%s</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char str[] = "freeCodeCamp"; 
  printf("%s\n", str); 
  return 0; 
} </code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>freeCodeCamp</code></pre><h3 id="immissione-di-caratteri-con-l-identificatore-di-formato-c-"><strong><strong>Immissione di caratteri con l'identificatore di formato</strong> <strong><code>%c</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char user_ch; 
  scanf("%c", &amp;user_ch); // l'utente inserisce Y
  printf("%c\n", user_ch); 
  return 0; 
} </code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>Y</code></pre><h3 id="input-stringa-con-l-identificatore-di-formato-s-"><strong><strong>Input stringa con l'identificatore di formato</strong> <strong><code>%s</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  char user_str[20]; 
  scanf("%s", user_str); // l'utente inserisce fCC
  printf("%s\n", user_str); 
  return 0; 
} </code></pre><p><strong>Output:</strong></p><pre><code>fCC</code></pre><h3 id="identificatori-di-formato-intero-decimale-d-e-i-"><strong>I<strong>dentificatori di formato intero decimale</strong> <strong><code>%d</code></strong> <strong>e <code>%i</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  int found = 2015, curr = 2020; 
  printf("%d\n", found); 
  printf("%i\n", curr); 
  return 0; 
} </code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>2015
2020</code></pre><h3 id="identificatori-di-formato-dei-numeri-in-virgola-mobile-f-e-e-"><strong>I<strong>dentificatori di formato dei numeri in virgola mobile</strong> <strong><code>%f</code></strong> <strong>e <code>%e</code>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt;

int main() { 
  float num = 19.99; 
  printf("%f\n", num); 
  printf("%e\n", num); 
  return 0; 
}</code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>19.990000
1.999000e+01</code></pre><h3 id="identificatore-di-formato-intero-ottale-o-"><strong>I<strong>dentificatore di formato intero ottale</strong> <strong><code>%o</code>:</strong></strong></h3><pre><code>#include &lt;stdio.h&gt; 

int main() { 
  int num = 31; 
  printf("%o\n", num); 
  return 0; 
}</code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>37</code></pre><h3 id="identificatore-di-formato-intero-esadecimale-x-"><strong>I<strong>dentificatore di formato intero esadecimale</strong> <strong><code>%x</code></strong> <strong>:</strong></strong></h3><pre><code class="language-c">#include &lt;stdio.h&gt; 

int main() { 
  int c = 28; 
  printf("%x\n", c); 
  return 0; 
} </code></pre><p><strong>Output<strong>:</strong></strong></p><pre><code>1c</code></pre> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Gestione dei file in C: come aprire, chiudere e scrivere su file ]]>
                </title>
                <description>
                    <![CDATA[ Se in precedenza hai già scritto il programma C helloworld, conosci già le basi dell'I/O dei file in C: /* Un semplice hello world in C. */ #include <stdlib.h> // Importa funzioni I/O. #include <stdio.h> int main() {     // Questo printf è dove avviene tutta la ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/gestione-dei-file-in-c-come-aprire-chiudere-e-scrivere-su-file/</link>
                <guid isPermaLink="false">620e37ee88090d0542dcbc27</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Angelo Mirabelli ]]>
                </dc:creator>
                <pubDate>Fri, 25 Feb 2022 09:45:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/02/5f9c9d31740569d1a4ca3667.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/file-handling-in-c-how-to-open-close-and-write-to-files/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">File Handling in C — How to Open, Close, and Write to Files</a>
      </p><p>Se in precedenza hai già scritto il programma C <code>helloworld</code>, conosci già le basi dell'I/O dei file in C:</p><pre><code class="language-c">/* Un semplice hello world in C. */
#include &lt;stdlib.h&gt;

// Importa funzioni I/O.
#include &lt;stdio.h&gt;

int main() {
    // Questo printf è dove avviene tutta la magia IO del file!
    // Che emozione!
    printf("Hello, world!\n");
    return EXIT_SUCCESS;
}</code></pre><p>La gestione dei file è una delle parti più importanti della programmazione. In C, utilizziamo un puntatore a una struttura di tipo file per dichiarare un file:</p><pre><code class="language-c">FILE *fp;</code></pre><p>C fornisce una serie di funzioni integrate per eseguire operazioni di base sui file:</p><ul><li><code>fopen()</code>- crea un nuovo file o apri un file esistente</li><li><code>fclose()</code>- chiude un file</li><li><code>getc()</code>- legge un carattere da un file</li><li><code>putc()</code>- scrive un carattere in un file</li><li><code>fscanf()</code>- legge un insieme di dati da un file</li><li><code>fprintf()</code>- scrive un insieme di dati in un file</li><li><code>getw()</code>- legge un numero intero da un file</li><li><code>putw()</code>- scrive un numero intero in un file</li><li><code>fseek()</code>- imposta la posizione sul punto desiderato</li><li><code>ftell()</code>- fornisce la posizione corrente nel file</li><li><code>rewind()</code>- imposta la posizione al punto iniziale</li></ul><h3 id="apertura-di-un-file"><strong><strong><strong><strong>Apertura di un file</strong></strong></strong></strong></h3><p>La funzione <code>fopen()</code> viene utilizzata per creare un file o aprire un file esistente:</p><pre><code class="language-c">fp = fopen(const char nomefile,const char modalità);</code></pre><p>Ci sono molte modalità per aprire un file:</p><ul><li><code>r</code> - aprire un file in modalità lettura</li><li><code>w</code> - apre o crea un file di testo in modalità scrittura</li><li><code>a</code> - apre un file in modalità "aggiungi"</li><li><code>r+</code> - apre un file sia in lettura che in scrittura</li><li><code>a+</code> - apre un file sia in lettura che in scrittura</li><li><code>w+</code> - apre un file sia in lettura che in scrittura</li></ul><p>Ecco un esempio di lettura di dati da un file e di scrittura su di esso:</p><pre><code class="language-c">#include&lt;stdio.h&gt;
#include&lt;conio.h&gt;
main()
{
FILE *fp;
char ch;
fp = fopen("hello.txt", "w");
printf("Inserisci il dato: ");
while( (ch = getchar()) != EOF) {
  putc(ch,fp);
}
fclose(fp);
fp = fopen("hello.txt", "r");

while( (ch = getc(fp)! = EOF)
  printf("%c",ch);
  
fclose(fp);
}</code></pre><p>Ora potresti pensare: "Questo stampa solo il testo sullo schermo. Come fa a essere IO su file?"</p><p>La risposta non è così ovvia all'inizio e richiede una certa comprensione del sistema UNIX. In un sistema UNIX, tutto viene trattato come un file, il che vuol dire che puoi leggere e scrivere su di esso.</p><p>Quindi anche il tuo printer può essere astratto ad un file poiché quello che fai con un printer è scrivere con esso. È anche utile pensare a questi file come flussi, poiché come vedrai in seguito, puoi reindirizzarli con la shell.</p><p>Quindi, come si collega questo a <code>helloworld</code> e all'IO sui file?</p><p>Quando si chiama <code>printf</code>, in realtà si sta semplicemente scrivendo su un file speciale chiamato <code>stdout</code>, abbreviazione di <strong><strong><strong><strong>standard output</strong></strong></strong></strong> . <code>stdout</code> rappresenta l'output standard come deciso dalla tua shell, che di solito è il terminale. Questo spiega perché è stato stampato sullo schermo.</p><p>Ci sono altri due flussi (es. file) che sono disponibili per te con un certo impegno, <code>stdin</code> e <code>stderr</code>. <code>stdin</code> rappresenta lo <strong><strong><strong><strong>standard input</strong></strong></strong></strong>, che la tua shell di solito collega alla tastiera. <code>stderr</code> rappresenta l'output <strong><strong><strong><strong>di errore standard</strong></strong></strong></strong> , che la tua shell di solito lega al terminale.</p><h3 id="io-rudimentale-su-file"><strong><strong><strong><strong>IO</strong></strong></strong> <strong><strong><strong>rudimentale</strong></strong></strong> su <strong><strong><strong>File</strong></strong></strong></strong></h3><p>Basta teoria, mettiamoci al lavoro scrivendo del codice! Il modo più semplice per scrivere su un file è reindirizzare il flusso di output utilizzando lo strumento di reindirizzamento dell'output, <code>&gt;</code>.</p><p>Se vuoi effettuare una aggiunta alla fine del file, puoi usare <code>&gt;&gt;</code>:</p><pre><code class="language-bash"># Questo stamperà sullo schermo...
./helloworld
# ...ma questo scriverà nel file!
./helloworld &gt; hello.txt</code></pre><p>Il contenuto di <code>hello.txt</code>, non a caso, sarà</p><pre><code class="language-text">Hello, world!</code></pre><p>Supponiamo di avere un altro programma chiamato <code>greet</code>, simile a <code>helloworld</code>, che ti saluta con un dato <code>name</code>:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    // Inizializza un array per contenre il nome.
    char nome[20];
    // Leggi la stringa e salvala in nome.
    scanf("%s", nome);
    // Print the greeting.
    printf("Ciao, %s!", nome);
    return EXIT_SUCCESS;
}</code></pre><p>Invece di leggere dalla tastiera, possiamo reindirizzare <code>stdin</code> alla lettura da un file utilizzando lo strumento <code>&lt;</code>:</p><pre><code class="language-bash"># Scrivi un file contenente un nome.
echo Kamala &gt; name.txt
# Questo leggerà il nome dal file e stamperà il saluto sullo schermo.
./greet &lt; name.txt
# ==&gt; Ciao, Kamala!
# Se vuoi anche scrivere il saluto su un file, puoi farlo usando "&gt;".</code></pre><p>Nota: questi operatori di reindirizzamento sono simili in <code>bash</code> e shell. </p><h3 id="il-vero-affare"><strong><strong><strong><strong>Il vero affare</strong></strong></strong></strong></h3><p>I metodi di cui sopra funzionano solo per i casi più elementari. Se vuoi fare cose più complicate e fatte meglio, probabilmente dovrai lavorare con i file all'interno di C invece che attraverso la shell.</p><p>Per fare ciò, utilizzerai una funzione chiamata <code>fopen</code>. Questa funzione accetta due parametri stringa, il primo è il nome del file e il secondo è la modalità.</p><p>Le modalità sono fondamentalmente delle autorizzazioni, quindi <code>r</code> per leggere, <code>w</code> scrivere, <code>a</code> aggiungere. Puoi anche combinarli, quindi <code>rw</code> significa che potresti leggere e scrivere sul file. Ci sono più modalità, ma queste sono quelle più comunemente usate.</p><p>Dopo aver ottenuto un puntatore <code>FILE</code>, puoi utilizzare praticamente gli stessi comandi IO che hai già usato, tranne per il fatto che devi anteporre loro una <code>f</code> e il primo argomento sarà il puntatore del file. Ad esempio, la versione per i file di <code>printf</code> è <code>fprintf</code>.</p><p>Ecco un programma chiamato <code>greetings</code> che legge dati da un file contenente un elenco di nomi e scrive i saluti in un altro file:</p><pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main() {
    // Crea i puntatori ai file.
    FILE *names = fopen("names.txt", "r");
    FILE *greet = fopen("greet.txt", "w");

    // Controlla che tutto sia OK.
    if (!names || !greet) {
        fprintf(stderr, "Apertura del file fallita!\n");
        return EXIT_FAILURE;
    }

    // Tempo di saluti!
    char nome[20];
    // Fondamentalmente continua a leggere finché non rimane più niente.
    while (fscanf(names, "%s\n", nome) &gt; 0) {
        fprintf(greet, "Ciao, %s!\n", nome);
    }

    // Una volta raggiunta la fine, stampa un messaggio sul terminale per informare l'utente.
    if (feof(names)) {
        printf("I saluti sono terminati!\n");
    }

    return EXIT_SUCCESS;
}</code></pre><p>Supponiamo che <code>names.txt</code> contenga quanto segue:</p><pre><code class="language-text">Kamala
Logan
Carol</code></pre><p>Quindi dopo aver eseguito <code>greetings</code> il file <code>greet.txt</code> conterrà:</p><pre><code class="language-text">Ciao, Kamala!
Ciao, Logan!
Ciao, Carol!</code></pre> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
