Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoValeria Neri Modificato 8 anni fa
1
2
I tipi di dati non primitivi sono gli array, le struct e le union. Gli array sono degli aggregati di variabili dello stesso tipo. La dichiarazione di un array è della forma: o char parola[10]; In questo modo si dichiara la variabile parola come un array di 10 caratteri. Il primo carattere `e contenuto in parola[0] e l’ultimo in parola[9]. Il C non controlla gli accessi agli array, quindi possiamo accedere all’elemento parola[15] senza che il compilatore produca nessun errore. Ovviamente, questo accesso è errato ed il risultato è imprevedibile.
3
Inoltre possiamo definire array multidimensionali come: o char frase[20][10]; che definisce una variabile frase di tipo array con 20 elementi (numerati da 0 a 19), ed ogni elemento è a sua volta un array di 10 caratteri (numerati da 0 a 9). Per accedere al quarto carattere del secondo elemento si scrive frase[1][3].
4
Gli array possono essere inizializzati nelle dichiarazioni, con la lista dei valori, separati da virgole, racchiusa tra parentesi graffe, ad esempio: o int tabella[4] = {10,23,34,45}; L’inizializzazione di un array multidimensionale corrisponde ad inizializzare ogni elemento dell’array con una lista. Ad esempio: o int a[2][3] = { {11, 12, 13}, {21, 22, 23}, o }; inizializza la prima riga dell’array con i valori 11, 12, 13 e la seconda riga con 21, 22, 23.
5
Equivalentemente, ma meno elegantemente, si può utilizzare: o int a[2][3] = {11, 12, 13, 21, 22, 23}; che produce lo stesso risultato. Infatti gli elementi di un array sono memorizzati per righe, in indirizzi consecutivi di memoria. Quindi, nell’esempio precedente, l’array è memorizzato con il seguente ordine: o a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2]
6
Oltre agli array, il C mette a disposizione il tipo struct, per aggregare variabili di tipo diverso. Ad esempio, con la dichiarazione: o struct laboratorio { char orario[20]; char aula; int studenti; o } lps; si dichiara il tipo struct laboratorio, formato da 3 campi eterogenei, e contemporaneamente viene dichiarata la variabile lps di tipo struct laboratorio.
7
Il tipo può essere riutilizzato per successive dichiarazioni di variabili, con: o struct laboratorio lpr; Per accedere ai campi di una variabile di tipo struct si utilizza l’operatore ‘.’. Ad esempio lps.aula `e una variabile di tipo carattere
8
Per creare nuovi tipi si utilizza typedef. Ad esempio: o typedef struct { char orario[20]; char aula; int studenti; o } laboratorio; definisce il tipo laboratorio come una struct di 3 campi. Dichiarando la variabile lps di tipo laboratorio con: o laboratorio lps; si ottiene lo stesso effetto della dichiarazione precedente. La sintassi generale di typedef è: o typedef tipo variabile di tipo ; e definisce un nuovo tipo con nome variabile di tipo.
9
Infine, il tipo union è simile al tipo struct con la differenza che tutti i campi sono memorizzati a partire dalla stessa locazione di memoria. Ad esempio, con la dichiarazione: o union atomo { int posizione[3]; long velocita; o } j; si definisce la variabile j di tipo atomo. Entrambe le variabili j.posizione e j.velocita sono memorizzate a partire dalla stessa locazione di memoria. Quindi l’occupazione di un tipo union è data dalla massima occupazione dei suoi campi.
10
Ad esempio, le variabili var struct e var union dichiarate come segue: struct { o int var_1 ; o char var_2; } var_struct; union { o int var_3 ; o char var_4; } var_union;
11
Si noti che i due campi della variabile var union sono sovrapposti tra loro, e può essere utilizzato solo un campo alla volta. Inoltre, non c’è modo di sapere se la var union contiene, in un dato istante, un intero oppure un carattere.
12
L’uso pi`u tipico delle union prevede quindi che sia presente un campo discriminatore: struct { o int tipo; /* discriminatore */ o union { o int campo1; o char campo2; o long campo3; o } }; In questo modo, il programmatore può memorizzare nel campo tipo (sempre presente) un codice numerico che indichi il contenuto attuale della union (per esempio: 1 se l’ultimo valore memorizzato è un int, 2 per un char, ecc.).
13
Il linguaggio C non mette a disposizione nessun tipo predefinito per trattare oggetti di tipo stringa. Ù Le stringhe sono quindi realizzate come vettori di caratteri. La fine di una stringa viene delimitata dal carattere \0 (il carattere il cui codice ASCII è zero). Ad esempio, la dichiarazione: o char stringa[6] = mango; definisce la variabile stringa di 6 caratteri (l’ultimo carattere contiene il delimitatore \0).
14
Nella dichiarazione di stringhe inizializzate, è possibile omettere il numero di caratteri. Il compilatore calcolerà automaticamente l’ampiezza dell’array per contenere la stringa. In generale, una stringa `e definita nel seguente modo: o char nome-variabile [] = valore-iniziale-della-stringa ; Quindi, dichiareremo semplicemente: o char stringa[] = mango; Essendo una stringa un array, la dichiarazione precedente è equivalente a: o char stringa[] = {’m’,’a’,’n’,’g’,’o’,’\0’};
15
Il tipo stringa (realizzato come un array di caratteri) è fondamentalmente diverso dal tipo carattere. Ad esempio, il carattere ‘a’ occupa 1 byte Invece, la stringa a occupa sempre 2 bytes: il carattere ‘a’ seguito dal carattere ’\0’ che delimita la fine della stringa. Si noti che, diversamente da Java, il linguaggio C utilizza un set di caratteri ASCII a 8 bit, e quindi rappresenta i caratteri con 1 byte. Quindi, le dichiarazioni: o char stringa[] = "m"; o char carattere = ‘m’; definiscono due variabili di tipo diverso, che occupano, rispettivamente, 2 bytes e 1 byte.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.