|
|
| << | < | > | >> |IndiceINTRODUZIONE ALL'EDIZIONE ITALIANA IX PREFAZIONE XI Capitolo 0 - INTRODUZIONE 1 Capitolo 1 - UN'INTRODUZIONE DIDATTICA 5 1.1 Per cominciare 5 1.2 Variabili e Aritmetica 8 1.3 L'istruzione for 11 1.4 Costanti simboliche 12 1.5 Una raccolta di programmi utili 13 1.6 Arrays 20 1.7 Funzioni 22 1.8 Argomenti - Chiamata per Valore 23 1.9 Array di caratteri 24 1.10 Visibilità; Variabili Esterne 27 1.11 Sommario 30 Capitolo 2 - TIPI, OPERATORI ED ESPRESSIONI 31 2.1 Nomi di variabili 31 2.2 Tipi e dimensioni dei dati 31 2.3 Le costanti 32 2.4 Le dichiarazioni 34 2.5 Operatori Aritmetici 35 2.6 Operatori Relazionali e Logici 36 2.7 Conversioni di Tipo 37 2.8 Operatori di Incremento e Decremento 40 2.9 Operatori Logici orientati al Bit 42 2.10 Operatori ed Espressioni di Assegnamento 44 2.11 Espressioni Condizionali 45 2.12 Priorità e Ordine di valutazione 46 Capitolo 3 - STRUTTURE DI CONTROLLO 49 3.1 Istruzioni e Blocchi 49 3.2 If - Else 49 3.3 Else - if 51 3.4 Switch 52 3.5 Loops - While e For 53 3.6 Loops - Do-while 56 3.7 Break 57 3.8 Continue 58 3.9 Goto e Label 59 Capitolo 4 - FUNZIONI E STRUTTURA DEI PROGRAMMI 61 4.1 Fondamenti 61 4.2 Funzioni che non ritornano interi 64 4.3 Ulteriori precisazioni sugli argomenti di funzione 66 4.4 Variabili Esterne 67 4.5 Regole di Visibilità 71 4.6 Variabili static 74 4.7 Variabili Register 75 4.8 Struttura a Blocchi 76 4.9 lnizializzazione 77 4.10 Ricorsione 79 4.11 Il Preprocessor C 80 Capitolo 5 - PUNTATORI ED ARRAY 83 5.1 Puntatori e Indirizzi 83 5.2 Puntatori e Argomenti di Funzioni 85 5.3 Puntatori ed Array 87 5.4 Aritmetica sugli Indirizzi 90 5.5 Puntatori a caratteri e Funzioni 93 5.6 I Puntatori non sono Interi 96 5.7 Array Multi-dimensionali 97 5.8 Array di Puntatori; Puntatori a Puntatori 98 5.9 lnizializzazione degli array di Puntatori 101 5.10 Confronto tra Puntatori e Array Multi-dimensionali 102 5.11 Argomenti sulla linea di comando 103 5.12 Puntatori a Funzioni 107 Capitolo 6 - STRUTTURE 111 6.1 Fondamenti 111 6.2 Strutture e funzioni 113 6.3 Arrays di strutture 115 6.4 Puntatori alle strutture 119 6.5 Strutture ricorsivi 121 6.6 Ricerca tabellare 125 6.7 Campi 127 6.8 Unioni 129 6.9 Typedef 130 Capitolo 7 - INPUT ED OUTPUT 133 7.1 Accesso alla Libreria Standard 133 7.2 Standard lnput ed Output - Getchar e Putchar 134 7.3 Output Formattato - Printf 135 7.4 lnput Formattato - Scanf 137 7.5 Conversione di Formati di Memoria 139 7.6 Accesso a File 140 7.7 Gestione degli Errori - Stderr e Exit 143 7.8 Input e Output di Linea 144 7.9 Altre Funzioni 145 Capitolo 8 - L'INTERFACCIA CON IL SISTEMA UNIX 147 8.1 Descrittori di file 147 8.2 1/0 a basso livello - Read e Write 148 8.3 Open, Creat, Close, Unlink 150 8.4 Accesso Random - Seek e Lseek 151 8.5 Esempio - Un'implementazione di Fopen e Getc 152 8.6 Esempio - Lista di Directory 156 8.7 Esempio - Un allocatore di memoria 159 Appendice A - MANUALE DI RIFERIMENTO DEL C 165 1. Introduzione 165 2. Convenzioni Lessicali 165 2.1 Commenti 165 2.2 Identificatori (Nomi) 165 2.3 Parole Chiave 166 2.4 Costanti 166 2.4.1 Costanti Intere 166 2.4.2 Costanti long esplicite 166 2.4.3 Costanti Carattere 166 2.4.4 Costanti Floating 167 2.5 Stringhe 167 2.6 Caratteristiche Hardware 167 3. Notazione Sintattica 167 4. Cosa c'è in un nome? 168 5. Oggetti e lvalue 169 6. Conversioni 169 6.1 Caratteri ed interi 169 6.2 Float e double 169 6.3 Floating e integral 169 6.4 Puntatori e interi 170 6.5 Unsigned 170 6.6 Conversioni aritmetiche 170 7. Espressioni 170 7.1 Espressioni primarie 171 7.2 Operatori unari 173 7.3 Operatori moltiplicativi 174 7.4 Operatori additivi 174 7.5 Operatori di shift 175 7.6 Operatori relazionali 175 7.7 Operatori di eguaglianza 175 7.8 Operatore AND sui bit 176 7.9 Operatore OR esclusivo sui bit 176 7.10 Operatore OR inclusivo sui bit 176 7.11 Operatore AND logico 176 7.12 Operatore OR logico 177 7.13 Operatore condizionale 177 7.14 Operatori di assegnamento 177 7.15 Operatore virgola 178 8. Dichiarazioni 178 8.1 Specifiche di classe di memoria 179 8.2 Specifiche di tipo 179 8.3 Dichiaratori 180 8.4 Significato dei dichiaratori 180 8.5 Dichiarazione di strutture e unioni 182 8.6 Inizializzazione 184 8.7 Nomi di tipo 186 8.8 Typedef 187 9. Istruzioni 187 9.1 Istruzione espressione 187 9.2 Istruzioni composte o blocco 188 9.3 Istruzione condizionale 188 9.4 Istruzione while 188 9.5 Istruzione do 188 9.6 Istruzione for 189 9.7 Istruzione switch 189 9.8 Istruzione break 190 9.9 Istruzione continue 190 9.10 Istruzione return 190 9.11 Istruzione goto 190 9.12 Istruzione con label 191 9.13 Istruzione nulla 191 10. Definizioni esterne 191 10.1 Definizioni di funzioni esterne 191 10.2 Definizioni di dati esterni 192 11. Regole di visibilità 192 11.1 Visibilità lessicale 193 11.2 Visibilità delle esterne 193 12. Linee di controllo del compilatore 194 12.1 Rimpiazzamento di simboli 194 12.2 Inclusione di file 195 12.3 Compilazione condizionale 195 12.4 Controllo di linea 195 13. Dichiarazioni implicite 196 14. Analisi dei tipi 196 14.1 Strutture e unioni 196 14.2 Funzioni 196 14.3 Array, puntatori ed indicizzazione 197 14.4 Conversione esplicita di puntatori 197 15. Espressioni costanti 198 16. Considerazioni di portabilità 199 17. Anacronismi 200 18. Sommario Sintattico 200 18.1 Espressioni 200 18.2 Dichiarazioni 202 18.3 Istruzioni 203 18.4 Definizioni esterne 204 18.5 Preprocessore 204 |
| << | < | > | >> |Pagina 1Il C è un linguaggio di programmazione di applicazione generale. E' stato sempre messo in stretta relazione a UNIX in quanto è stato sviluppato su questo sistema operativo, e poiché UNIX stesso ed il suo software sono scritti in C. Tuttavia il linguaggio non è legato ad alcun sistema operativo o macchina e, nonostante sia stato considerato come un "linguaggio di programmazione di sistema" per la sua utilità nella scrittura di sistemi operativi, è stato usato altrettanto bene per scrivere grossi programmi numerici, di text processing e data-bases. Il C è un linguaggio relativamente a "basso livello". Questa non è certo una caratteristica negativa; significa semplicemente che il C ha a che fare con lo stesso tipo di oggetti trattati dalla maggior parte dei computers come caratteri, numeri ed indirizzi. Questi possono essere combinati e trasferiti attraverso gli operatori logici ed aritmetici implementati dalle macchine attuali. Il C non dispone di operazioni per trattare direttamente oggetti strutturati come stringhe di caratteri, insiemi, liste ed array considerati come un'unità. Non esistono, ad esempio, operazioni analoghe a quelle dei PL/1 che manipolano interi array o stringhe. Il linguaggio non definisce altre possibilità di allocazione di memoria che la definizione statica e la gestione a stack fornita dalle variabili locali delle funzioni: non ci sono meccanismi di heap o "garage collection" come quelli dell'Algol 68. Infine il C in sé stesso non possiede funzioni di input-output: non ci sono istruzioni READ e WRITE, né sono predisposti metodi di accesso ai files. Tutti questi meccanismi di livello più alto devono essere supportati da funzioni chiamate esplicitamente. Allo stesso modo, il C offre solo lineari costrutti di controllo: test, cicli, raggruppamenti e sottoprogrammi, ma non la multiprogrammazione, operazioni parallele, sincronizzazione e co-routines. Sebbene l'assenza di alcune di queste caratteristiche possa sembrare una grave mancanza ("Vuoi dire che devo chiamare una funzione per confrontare due stringhe di caratteri?"), il fatto di aver contenuto il linguaggio in dimensioni modeste ha portato vantaggi reali. Poiché il C è relativamente piccolo, può essere descritto in uno spazio limitato ed imparato rapidamente. Un compilatore per il C può essere semplice e compatto. I compilatori stessi vengono scritti velocemente; usando la tecnologia dei nostri giorni, è probabile che si produca un compilatore per una nuova macchina in un paio di mesi, scoprendo che l'80% dei codice dei nuovo compilatore è comune a quelli già esistenti. Ciò produce un alto valore di mobilità del linguaggio. Poiché i tipi di dati e le strutture di controllo fornite dal C sono direttamente supportate dalla maggior parte dei computer esistenti, la libreria richiesta in esecuzione per implementare programmi a se stanti, risulta piccola. Sul PDP/11, per esempio, contiene solamente le routine per ottenere la moltiplicazione e la divisione in 32 bit e per gestire le sequenze di entrata e uscita dalle subroutine. Naturalmente, ogni implementazione provvede a dare una comprensibile e compatibile libreria di funzioni per isolare l'i/O, la gestione delle stringhe e le operazioni di allocazione di memoria, ma poiché vengono chiamate solo esplicitamente, possono essere evitate se opportuno; anch'esse possono essere scritte portabilmente in C. Poiché il linguaggio riflette le prestazioni dei computer attuali, i programmi C tendono ad essere abbastanza efficienti da non avere l'esigenza di essere riscritti in linguaggio assembier. Il più ovvio esempio è il sistema operativo UNIX stesso, scritto quasi interamente in C. Su 13000 linee di codice di sistema, solo appena 800 linee al livello più basso sono in assembier. Inoltre, praticamente tutti i programmi applicativi di UNIX sono scritti in C; la stragrande maggioranza degli utenti UNIX (compreso uno degli autori di questo libro) non conoscono neanche l'assembier dei PDP-1l. | << | < | > | >> |Pagina 83Un puntatore è una variabile che contiene l'indirizzo di un'altra variabile. I puntatori sono molto usati in C, in parte perché rappresentano talvolta l'unica maniera per esprimere un calcolo, ed in parte perché generalmente portano ad un codice più compatto ed efficiente di quanto possa essere ottenuto con altri procedimenti. I puntatori, assieme all'istruzione "goto", sono stati considerati una maniera meravigliosa per creare programmi impossibili da capire. Questo è certamente vero quando vengono usati senza un preciso motivo, e diventa facile creare puntatori che puntano dove non ci si aspetterebbe. Con criterio, comunque, i puntatori possono essere usati per ottenere chiarezza e semplicità. Questo è l'aspetto che tenteremo di illustrare. | << | < | > | >> |Pagina 111Una struttura è un insieme di una o più variabili, eventualmente di tipo diverso, raggruppate sotto un unico nome per consentirne un trattamento più comodo. (Le strutture sono chiamate "records" in alcuni linguaggi, tra i quali ricordiamo il Pascal). Un tipico esempio di struttura è la registrazione delle paghe: un impiegato viene descritto da un insieme di attributi come il nome, l'indirizzo, il numero di previdenza sociale, lo stipendio, ecc. Alcuni di essi potrebbero a loro volta essere strutture: un nome ha diverse componenti, come ne hanno un indirizzo ed anche uno stipendio.
Le strutture aiutano ad organizzare dati
complessi, particolarmente in grossi programmi,
poiché in molte situazioni permettono di trattare
un gruppo di variabili in relazione tra di loro
come un'unità e non come entità separate. In
questo capitolo cercheremo di illustrare come
vengono usate le strutture. I programmi che
useremo sono più lunghi di molti altri nel libro,
ma rimagono di dimensioni modeste.
|