SlackNewbie ha scritto: ↑sab 18 lug 2020, 12:57
Come la devo pensare l'applicazione dei due operatori?
Perchè applicandoli alla variabile puntatore ottengo sempre lo stesso risultato??
In generale, la devi pensare in sequenza, secondo la regola di associatività, che in questo caso è da dx a sx.
Quindi prima hai: *ptr, che restituisce il valore a cui punta, che è il valore di num. Con & chiedi l'indirizzo di memoria in cui si trova questo valore, che è l'indirizzo di num.
Nel secondo caso &ptr ti dice qual è la posizione in memoria del puntatore. Con * vuoi conoscere il valore che contiene, che è sempre l'indirizzo di num.
E se facessi combinazioni strane,ad esempio *&*ptr,otterrei errore di sintassi?Non avrebbe senso??
Da un punto di vista dell'utilità, no, ma, come sintassi l'esempio va bene.
Equivale a: *(&(*ptr)) , vista la pari precedenza e l'associatività dx->sx.
*ptr ti dà il valore della variabile puntata a quell'indirizzo, num, che si sa rappresenta un intero
&(*ptr) ti dà l'indirizzo di num
*(&(*ptr)) ti dà il valore di quanto è contenuto all'indirizzo di num, ossia il valore di num
Codice: Seleziona tutto
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num=7,*ptr;
ptr=#
printf("Valore di num: %d\n",*&*ptr);
return 0;
}
Valore di num: 7
Però, scusa, perché non hai provato subito da solo?
Non lo prendere come un rimprovero, ma come un consiglio: se ti viene in mente una cosa, provala!
Spesso il compilatore ti fornisce indizi utili per capire che cosa non va.
Provare, riprovare e riprovare ancora è il modo migliore per imparare.
Oltretutto, a volte gli standard possono essere complicati (C++, MPI), può essere facile fare confusione e/o ci si può dimenticare qualcosa, senza contare che i compilatori possono deviare dallo standard (mancate implementazioni o estensioni) o avere le loro peculiarità. Se sei incerto, prova. Se sei curioso, prova.
Comunque, per quanto riguarda le "combinazioni strane", secondo me non ha molto senso spingersi oltre un certo limite nel testare la sintassi. A un certo punto, come già detto da brg, che funzioni o no può dipendere da compilatore a compilatore o dalla revisione dello standard.
Ad esempio, se nel programmino sopra aggiungi un commento con // e compili con
gcc -ansi programmino.c
ottieni:
ex1.c: In function ‘main’:
ex1.c:6:5: error: C++ style comments are not allowed in ISO C90
Inoltre, non ha senso aggiungere a sproposito alla complessità di funzionamento del programma anche quella sintattica...
Domanda:ma sizeof è un operatore o una funzione??
E' un operatore.
Vedi:
https://en.cppreference.com/w/c/language/sizeof
https://en.wikipedia.org/wiki/Sizeof
Lo trovi anche nella tabella degli operatori di cui ho fornito il link nell'altro commento.
Però, scusa, anche qui: uno risponde volentieri alle domande e nessuna domanda è mai stupida, tuttavia ci sono casi, come questo, in cui è molto più veloce ed esaustivo cercare la risposta con un motore di ricerca... Se hai intenzione di continuare a programmare e non semplicemente di passare un esame, ti conviene abituarti a chiedere aiuto quando, dopo aver provato, non sei riuscito a risolvere il problema, a trovare le informazioni che cercavi o a capire perché non hai ottenuto il risultato che ti aspettavi. Non sono d'accordo con quelli che rispondono con un secco e antipatico "RTFM", abbastanza in voga anni fa, tuttavia, vista l'abbondanza di documentazione disponibile in rete, un minimo sforzo per consultarla andrebbe fatto...
Come posso vedere il codice di funzioni predefinite del C??
Scaricando i sorgenti della libc:
http://ftp.slackware.com/pub/slackware/ ... .30.tar.xz
oppure:
ftp://ftp.gnu.org/pub/gnu/libc/
Ma non è banale metterci le mani. Una parte è scritta anche in assembly. Va bene guardarla per curiosità, ma se fossi in te per ora mi focalizzerei su altro. In ogni caso, qui trovi il manuale:
https://www.gnu.org/software/libc/manua ... /libc.html