Newsgroup: it.comp.lang.c
Titolo: funzioni ed array

Scusate la banale domanda,
sia gli array sia le funzioni sono considerati tipi di dato del C?
Un'altra cosa, è definita la keyword const dallo standard? Perché in quasi
tutti i libri che avevo letto dicevano che era solamente una specifica
aggiunta da alcuni compilatori.
Grazie.
Distinti Saluti.
 

era solamente una specifica aggiunta da alcuni compilatori.
*Quali* libri ?
"const" e' uno specificatore definito sin dalle prime versioni del
linguaggio. Stai attento al fatto che in C, differentemente rispetto
al C++, const non definisce vere e proprie costanti, ma piu' che altro
variabili con valore non modificabile (so che sembra un controsenso ma
e' cosi').
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

Ma allora per quale motivo sizeof - che prende o una variabile o un tipo -
può essere formulato come:
sizeof ( int (int a, int b) ); ?
questo è stato l'origine del mio dubbio sulle funzioni.
Inoltre un puntatore non si "appoggia" solamente su altri tipi di dato?
Il libro che avevo letto era Programmare in C - accidenti non mi ricordo
l'autore -, ed oltre al discorso delle costanti si diceva che in C non c'è
niente che non possa essere considerato tipo di dato.
Cmq grazie.
Distinti Saluti.
 

niente che non possa essere considerato tipo di dato.
E' una frase alquanto inconcludente. Sei sicuro di non aver capito
male ? Un operatore, ad esempio, non e' un tipo di dato.


Va bene, adesso è tutto chiaro. 
Il mio compilatore non fa storie su quel codice, non capisco il perché.
Cmq se:
sizeof(int (int a, int b));
è sbagliato, credo che almeno sia giusto un:
sizeof(int (*) (int a, int b)); // puntatore a funzione
Nel libro è riportata pari pari la frase scritta in precedenza dal
sottoscritto e penso di non aver capito male.
Per quanto riguarda le costanti esse sono considerate tipo a parte come in
C++?
Altra domanda: I tipi primitivi in C sono:
unsigned char
char
int
unsigned int
short int
unsigned short int
long int
unsigned long int
float
double
long double
void
Ma allora cosa vogliono dire signed int, signed short, unsigned long long,
. ?
Per prima cosa credevo che signed fosse valida solo in C++ ed inoltre,
ammettendo il caso che i tipi sopra menzionati esistano, sono estensioni
standard o specifiche del compilatore.
Grazie.
Francesco Agostino Fassi.

 Un'altra cosa, è definita la keyword const dallo standard?
Si.
EMG

standard o specifiche del compilatore.
standard.


Eppure nella Tricky C si diceva che:
char == signed character
unsigned char == unsigned character
Long Long cos'č?
Credo che riguardi gli interi in quanto credo che sia l'abbreviazione di
long long int, ma esattamente cosa rappresenta?
Distinti Saluti.
Francesco Agostino Fassi.

 niente che non possa essere considerato tipo di dato.
Nel senso che anche il nome di una funzione può essere passato come
parametro. Ma in quel caso decade nel puntatore alla stessa funzione. E
nel sizeof questo non avviene.
EMG

 standard o specifiche del compilatore.
Sono sicuramente tutti standard tranne l'ultimo del quale non sono
sicuro. Sicuramente non lo era prima della recente revisione.
EMG

long long int, ma esattamente cosa rappresenta?
Un intero di ampiezza maggiore dei long classici.
Non so con esattezza se sia standard o meno.


Beh, forse il suo unico vero problema è che non spiega cosa è standard e
cosa no.



Di problemi quel "libro" ne ha molti.


Sempre sulle funzioni e sugli array:
sia il nome della funzione che degli array sono rispettivamente puntatori
al primo byte e al primo elemento, ma essi a che tipo puntano esattamente?
Essendo puntatori credo che sia possibile dereferenziarli, ma che valore
rappresentano?
Grazie.
 

 long long int, ma esattamente cosa rappresenta?
Un tipo un po' più capiente di un long int.
EMG


Sotto Linux su architetture x86 rappresenta un intero a 64 bit...
E' stato ratificato dallo standard, ed e' almeno uguale o piu' grosso di un
long ( sempre secondo la solita filosofia del C )

 rappresentano?
Non sono puntatori ma, nel caso dell'array, è possibile dereferenziarlo
in quanto viene, appunto, convertito nel puntatore al primo elemento.
Quindi l'operazione di dereferenza dà come risultato il valore del primo
elemento dell'array.
EMG

Nella Tricky C era scritto tutto il contrario - senza offesa -, ma dato che
lo dici tu che sei tra i più esperti del C e C++ allora ci credo.
Cmq quando tento di dereferenziare il nome dell'array mi viene stampato 24
(indipendentemente dal valore del primo elemento). Dev'essere un bug del
compilatore.
Grazie ancora.

Nella Tricky C era scritto tutto il contrario
Aridaglie...


al primo byte e al primo elemento, ma essi a che tipo puntano esattamente?
Ti blocco : no, non lo sono.
O meglio, non lo sono ma lo diventano in circostanze particolari.
Esistono tre eccezioni specifiche per le quali il nome di un array non
decade nel puntatore al suo primo elemento e sono quando e' operando
di & e sizeof e quando esso e' il valore letterale stringa con cui si
inizializza un altro array.


Allora credo che sia meglio cestinare quel "libro". Sembrava cosě
completo...