Puntatori chiarimenti [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2093
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 5.19.0
Desktop: gnome and lxqt
Distribuzione: ubuntu 22.04
Località: Darmstadt - Germania

Re: Puntatori chiarimenti

Messaggio da albatros »

SlackNewbie ha scritto:
dom 12 lug 2020, 18:26
Ciao brg :)
Dunque con
scanf("%d",*ptr1);
dovrei riuscire a scrivere all'indirizzo della variabile num??
Sì, perché *ptr1 contiene l'indirizzo in memoria di num, che è quello che serve a scanf per fare il suo lavoro.
E per stampare il valore,sfruttando sempre la variabile ptr1,basta fare cosi:

Codice: Seleziona tutto

printf("%d",*ptr1);
??
Il discorso non mi quadra più... :oops:
E se volessi generalizzare ed cioè far uso di un puntatore ad un puntatore ad un puntatore ......ecc. che punta alla variaible num per modificare il valore di quest'ultima??
No, devi usare **ptr1. ptr1 contiene l'indirizzo di ptr. Con *ptr1 scopri che cosa c'è a questo indirizzo, ossia la locazione di memoria di un intero, num (l'informazione che serviva a scanf). Ora vuoi fare il passo successivo e scoprire quanto vale num. Devi scendere un altro livello, aggiungendo un altro asterisco, come ho fatto nell'esempio del messaggio precedente.

Ciao!

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Salve!!!
Grande albatros :D =D>
fantastico ho finalmente capito come vanno le cose \:D/
Ora però provo a generalizzare con tre puntatori o meglio con un puntatore che punta ad un puntatore che puntaad un puntatoreche punta ad una varibile di tipo int.
Comunque si ho capito il giochino!!!
Un ultima domanda,se mi è concessa,senza andare off topic,e cioè:che lega vi è tra puntatori ed array??
In particola,l'ndirizzo di un vettore coincide solo con l'indirizzo della sua prima cella??
Per scoprire il suddetto indirizzo posso far uso sia di un puntatore che del nome stesso del vettore?Ed in quest'ultimo caso qual è la giusta sintassi?
int vet[]={1,2,3,4,5}
printf("\n %p",vet);
printf("%p",&vet[]);
printf("%p",vet[0]);
printf("%p",&vet[0]);
??

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2093
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 5.19.0
Desktop: gnome and lxqt
Distribuzione: ubuntu 22.04
Località: Darmstadt - Germania

Re: Puntatori chiarimenti

Messaggio da albatros »

Consiglio sempre di provare e sperimentare, finché il tuo programma non controlla qualche dispositivo e lo lanci sul tuo personal computer non corri praticamente mai il rischio di fare danni.

printf("\n %p",vet); OK, ma io metterei \n dopo %p
printf("%p",&vet[]); NO
printf("%p",vet[0]); NO, %p serve per visualizzare un indirizzo di memoria, ma vet[0] è quanto è contenuto in quell'indirizzo di memoria, ossia un intero, quindi dovresti usare %d
printf("%p",&vet[0]); OK

Allego un programmino che dovrebbe chiarire ulteriormente la situazione.
Adesso dovresti avere le basi per andare avanti da solo.

In rete, soprattutto se cerchi materiale in inglese, trovi tantissime cose, a tutti i livelli.
Non aver paura di provare e sperimentare, è il modo migliore per imparare!

Ciao, buon divertimento!

Codice: Seleziona tutto

#include<stdlib.h>
#include<stdio.h>


/* funzione ausiliaria per visualizzare i contenuti di un blocco di memoria contenente n interi */
void visualizza(int *p, int n)
{
        int i;
        for(i=0;i<n;i++)
        {
                printf("Indirizzo di p[%d]: %p, valore: %d -- indirizzo di (p+%d): %p, valore: %d\n", i,&p[i],p[i],i,(p+i),*(p+i));

        }


}


int main()
{
int i;
int vet[]={1,2,3,4,5};
int *pointer;

printf("Il nome dell'array, vet, corrisponde a una locazione in memoria: %p\n",vet);
printf("coincidente con quella del suo primo elemento: %p\n",&vet[0]);

printf("Si può navigare dentro vet sia con gli indici dell'array sia con l'aritmetica dei puntatori:\n");
for(i=0;i<5;i++)
{
        printf("Indici: indirizzo di vet[%d]: %p, valore: %d, valore di *(vet+%d): %d\n",i,&vet[i],vet[i],i,*(vet+i));
}
printf("Si può notare che i vari elementi di vet sono memorizzati in modo contiguo a intervalli di %ld bytes\n",sizeof(int));
printf("e che *(vet+%d) tiene conto di quest situazione sommando in memoria non i, ma i*sizeof(int)`\n",i);

pointer=(int*) calloc(5,sizeof(int));//alloco in memoria un blocco di 5 elementi ciascuno in grado di contenere un intero e lo inizializzo a 0
if(pointer==NULL)//controllare sempre che l'allocazione sia andata a buon fine, con array molto grandi potrebbe non farlo
{
        printf("Allocazione in memoria fallita.\n");
        exit(1);
}
printf("Ho allocato memoria sufficiente per un array di 5 interi, controllo che sia stata inizializzata a 0:\n");
visualizza(pointer,5);

//memorizzo dei valori nel blocco di memoria allocato usando sia la sintassi degli array che l'aritmetica dei puntatori
for(i=0;i<3;i++) *(pointer+i)=100*i;
for(i=3;i<5;i++) pointer[i]=100*i;

printf("Ho assegnato dei valori e ora nel blocco di memoria allocato ho:\n");
visualizza(pointer,5);

return 0;

}

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Salve!!!
Ciao albatros :) e grazie per il grande aiuto che mi stai dando...davvero
è pazzesco riesci a spiegare meglio tu del mio prof all'uni!!!!
Per quanto riguarda il codice da te postato mi è tutto chiaro tranne le linee di codice dalla funzione calloc in poi

Codice: Seleziona tutto

pointer=(int*) calloc(5,sizeof(int));//alloco in memoria un blocco di 5 elementi ciascuno in grado di contenere un intero e lo inizializzo a 0
if(pointer==NULL)//controllare sempre che l'allocazione sia andata a buon fine, con array molto grandi potrebbe non farlo
{
        printf("Allocazione in memoria fallita.\n");
        exit(1);
}
printf("Ho allocato memoria sufficiente per un array di 5 interi, controllo che sia stata inizializzata a 0:\n");
visualizza(pointer,5);

//memorizzo dei valori nel blocco di memoria allocato usando sia la sintassi degli array che l'aritmetica dei puntatori
for(i=0;i<3;i++) *(pointer+i)=100*i;
for(i=3;i<5;i++) pointer[i]=100*i;

printf("Ho assegnato dei valori e ora nel blocco di memoria allocato ho:\n");
visualizza(pointer,5);

return 0;

}
non ho ancora studiato questo argomento anche se lo abbiamo trattato... :oops:
Potresti darmi una piccola delucidazione sul funzionamento della calloc, relativamente al codice da te postato??
Ancora una domanda [-o< :
-come si passa un puntatore ad una funzione??
-ha senso (e se si come si fa?) dichiarare un puntatore ad una funzione??(a tal riguardo è solo un mero aspetto teorico del linguaggio o serve realmente questa cosa nel realizzare in C determinati algoritmi??)
Ti ringrazio ancora per l'aiuto

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Salve!!
Ufff...ragazzi scusate se disturbo sempre ma mi è venuto un dubbio compilando leseguenti linee di codice:

Codice: Seleziona tutto

int main()
{
    int num=7,*ptr;
    ptr=&num;
    //modalità di visualizzazione dell'indirizzo della variabile num
    printf("\nIndirizzo di num: %p",&num);
    printf("\nIndirizzo di num: %p",ptr);
    printf("\nIndirizzo di num: %p",&*ptr);
    printf("\nIndirizzo di num: %p",*&ptr);
    //modalità di visualizzazione del valore della variabile num
    printf("\nValore di num: %d",num);
    printf("\nValore di num: %d",*ptr);
    printf("nValore di num: %d",&*num);
    printf("\nValore di num: %d",*&num);
    printf("\n\n");
    return 0;
}
è un esempio sull'uso combinato degli operatori & ed *
Ma se faccio &* oppure *& non dovrebbero annullarsi gli "effetti" per così dire e quindi è come se non avessi applicato alcuno dei due operatori??
La risposta a questa domanda sembre essere si per quanto riguarda &*ptr ed *&ptr,invece,per &*num ed *&num il giochetto non funziona....
Mi sta sfuggendo di nuovo qualcosa??

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Puntatori chiarimenti

Messaggio da brg »

SlackNewbie ha scritto:
mar 14 lug 2020, 18:04
Mi sta sfuggendo di nuovo qualcosa??
Eh, sì.
Con

Codice: Seleziona tutto

&*num
esegui l'operazione di andare a cercare l'indirizzo (tramite l'operatore &) della variabile puntata da *num, ma *num non punta a niente, quindi è un errore.

Invece

Codice: Seleziona tutto

*&num
normalmente funziona, se non funziona è colpa (merito) del compilatore.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Ciao brg e grazie per la risposta!!
& ed * sono degli operatori giusto??
Come tali se applicati ad una varibile si ha che:
-per quanto riguarda &,esso fornisce l'indirizzo della variabile (dell'operando) alla sua destra;
-per quanto riguarda *(applicabile ad una variabile puntatore ossia una variabile che contiene un indirizzo) ,esso fornisce il valore presente all'indirizzo puntato.
Questo discorso come lo applico quando faccio la combinazione dei due operatori??
Per quanto riguarda *&num : &num mi fornisce l'indirizzo della variaible num e poi *(&num) mi restituisce il valore presente a quell'indirizzo.
Domanda:ha priorità maggiore l'operatore più a destra??
Gli altri casi non riesco a spiegarli....

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

*&num

normalmente funziona, se non funziona è colpa (merito) del compilatore.
Cosa intendi dire??
Non dovrebbe dipendere da come è stato "strutturato" ("studiato",messo a punto o dir si voglia) il linguaggio C??

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Ufff sto uscendo pazzo....e sono solo al livello teorico....figuratevi se dovessi sviluppare un algoritmo per risolvere un problema.
Mi meraviglio quando leggo in giro su internet che i programmatori in genere guadagno male,caspita un singolo linguaggio ha tantissime sfaccettature ed è difficile raccapezzarsi. Va buo pensiero mio,chiedo scusa!!!

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2093
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 5.19.0
Desktop: gnome and lxqt
Distribuzione: ubuntu 22.04
Località: Darmstadt - Germania

Re: Puntatori chiarimenti

Messaggio da albatros »

non ho ancora studiato questo argomento anche se lo abbiamo trattato... :oops:
Potresti darmi una piccola delucidazione sul funzionamento della calloc, relativamente al codice da te postato??
Beh, se lo avete trattato, ti invito a prendere visione del materiale della lezione.
Nel caso non sia sufficiente, in rete c'è una quantità enorme di materiale al riguardo, con numerosi esempi. :)

Comunque, riferendosi all'esempio fatto in precedenza:

calloc alloca memoria nell'heap e la inizializza a 0.
Prende come argomenti quanti elementi vuoi allocare e quanti bytes occupa ciascuno e restituisce un puntatore a dove inizia l'area di memoria allocata.
Se non è possibile allocare la memoria richiesta, calloc restituisce NULL.
Per informazioni ufficiali:

Codice: Seleziona tutto

man calloc
Nel caso dell'esempio:

pointer=(int*) calloc(5,sizeof(int))

si è allocato spazio per 5 elementi (primo argomento di calloc), ognuno di dimensione appropriata per memorizzare un intero (risultato di sizeof(int), secondo argomento). (*int) è un cast a un puntatore a un intero.

Nell'if successivo, prima di andare avanti si controlla che l'allocazione sia andata a buon fine. Se il puntatore è NULL, viene stampato un messaggio e arrestato il programma.

Aggiungo soltanto la raccomandazione, quando allochi memoria, di ricordarti di deallocarla con free quando non ti serve più (nell'esempio ci sarebbe stata bene una riga: free(pointer); ). Io non l'ho fatto per brevità, tanto il programma finiva, ma è importante se vuoi evitare memory leaks. Valgrind è tuo amico nel controllare che il codice sia scritto bene.
Ancora una domanda [-o< :
-come si passa un puntatore ad una funzione??
-ha senso (e se si come si fa?) dichiarare un puntatore ad una funzione??(a tal riguardo è solo un mero aspetto teorico del linguaggio o serve realmente questa cosa nel realizzare in C determinati algoritmi??)
Ti ringrazio ancora per l'aiuto
Allego codice di esempio:

Codice: Seleziona tutto

#include<stdlib.h>
#include<stdio.h>

void messaggio_lavoro() { printf("lavoro.\n"); }
void messaggio_riposo() { printf("riposo.\n"); }

int main()
{
        void (*messaggio)(); //puntatore a funzione
        int i;
        const int turno=4;
        for(i=1;i<=50;i++)
        {
                if(i%4==0)
                {
                        messaggio=&messaggio_riposo;
                }
                else
                {
                        messaggio=&messaggio_lavoro;
                }
                printf("Giorno %2d: ",i);
                (*messaggio)();
        }
        return 0;
}
Il programmino fa un ciclo da 1 a 50, chiamando una funzione tramite puntatore a ogni iterazione. La funzione puntata è messaggio_riposo se il numero è multiplo di 4, altrimenti è messaggio_lavoro.

Senza pretese di precisione, né di completezza: un puntatore a funzione ti consente di scrivere in modo più agevole e pulito codice che si comporta in modo diverso a seconda della situazione. Ad esempio, potresti voler scrivere una funzione che ordina dei dati. Con un puntatore che punta a una funzione diversa nel caso che tu voglia ordinare in senso decrescente o crescente, puoi scrivere codice in modo molto compatto e facilmente riusabile. Oppure potresti voler ordinare frasi. O tipi di strutture complesse anche molto diverse fra loro. Scrivi una parte di codice generale, senza doverla ripetere per tutti i casi, e con un puntatore a funzione gestisci le diverse situazioni. Se un giorno vorrai aggiungere un nuovo metodo di ordinamento (ad es., nel caso stia ordinando frasi, per lunghezza della frase o per numero di vocali in essa contenute), ti basterà scrivere una nuova funzione senza modificare il resto del codice. Altro esempio: potresti dover scrivere su diversi tipi di dispositivo. Crei una funzione write() con all'interno un puntatore a funzione che, in base al dispositivo, punta a funzioni che svolgono azioni diverse. Spero di aver dato un'idea...

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2093
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 5.19.0
Desktop: gnome and lxqt
Distribuzione: ubuntu 22.04
Località: Darmstadt - Germania

Re: Puntatori chiarimenti

Messaggio da albatros »

SlackNewbie ha scritto:
mer 15 lug 2020, 12:32
Domanda:ha priorità maggiore l'operatore più a destra??
Dipende, in generale, no. A parità di classe di precedenza, a volte sì, come nel caso di *&variabile , con associatività da dx a sx, equivalente quindi a *(&variabile).
Ma 7*2+1=15, non 21, perché * ha la precedenza su +.
E 12/6*2 fa 4 e non 1 perché / e * hanno la stessa precedenza, ma associatività da sx a dx, quindi equivale a (12/6)*2 e non a 12/(6*2).

Trovi qui https://en.cppreference.com/w/c/languag ... precedence una tabella con le varie precedenze.

In generale, se uno ci pensa bene, le regole sono abbastanza intuitive e logiche, ma, in caso di dubbio, meglio usare parentesi e fare delle prove.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Salve!!!
Ciao albatros e grazie per l'attenzione che mi stai dando.
Sei stato chiarissimo sull'uso della calloc,come già successo sono riuscito a capire più con la tua spiegazione che con quella del prof!!!
Mi sono un attimino perso,più che altro a livello di sintassi,per quanto riguarda il passaggio(come parametro) di un puntatore ad una funzione ed di un puntatore che punta ad una funzione.
Ci sto ancora pensando....
Ti espongo se possibile un dubbio che ancora mi rimane:
l'uso degli operatori '&' ed '*' assieme ossia :

Codice: Seleziona tutto

int main()
{
    int num=7,*ptr;
    ptr=&num;
    //modalità di visualizzazione dell'indirizzo della variabile num
    printf("\nIndirizzo di num: %p",&num);
    printf("\nIndirizzo di num: %p",ptr);
    printf("\nIndirizzo di num: %p",&*ptr);
    printf("\nIndirizzo di num: %p",*&ptr);
    //modalità di visualizzazione del valore della variabile num
    printf("\nValore di num: %d",num);
    printf("\nValore di num: %d",*ptr);
    printf("nValore di num: %d",&*num);
    printf("\nValore di num: %d",*&num);
    printf("\n\n");
    return 0;
Come la devo pensare l'applicazione dei due operatori?
Perchè applicandoli alla variabile puntatore ottengo sempre lo stesso risultato??
E se facessi combinazioni strane,ad esempio *&*ptr,otterrei errore di sintassi?Non avrebbe senso??
Domanda:ma sizeof è un operatore o una funzione??
Come posso vedere il codice di funzioni predefinite del C??
Grazie ancora per la pazienza.

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2093
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 5.19.0
Desktop: gnome and lxqt
Distribuzione: ubuntu 22.04
Località: Darmstadt - Germania

Messaggio da albatros »

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=&num;
    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... :-k
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

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Salve!!!
Ciao albatros :) ti ringrazio come sempre per l'aiuto.Sei sempre molto chiaro nella spiegazione.
Dunque,se applico * ed & alla variabile puntatore cioè se faccio

Codice: Seleziona tutto

int num=5;
int *ptr;
ptr=&num;
printf("%p",*&ptr);
printf("%p",&*ptr);
ottengo lo stesso risultato(ed in questo caso si parla di complementarietà dei due operatori).
Invece fare
*&num
mi restituisce il valore presente all'indirizzo di num;al contrario fare &*num non ha senso perchè l'operatore * si applica solo a variabili di tipo puntatore.
Giusto?
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.
Sinceramente non lo capisco molto il compilatore quando mi segna errore :oops: e poi non mi fornisce una chiara giustificazione del perchè dell'errore,cosa che invece hai fatto tu!!!
Provare e riprovare mi sa troppo di metodo euristico..... mi da la sensazione di andare a tentativi... bho non come spiegarmi.
Ma le proprietà del linguaggio C non sono sempre quelle ed i compilatori non sono studiati per funzionare (compilare) su codice C avente quelle proprietà?
Inoltre, non ha senso aggiungere a sproposito alla complessità di funzionamento del programma anche quella sintattica...
Si hai del tutto ragione.
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...
Preferisco più discuterne con persone in un forum ed avere risposte precise ad un mio dubbio specifico piuttosto che accedere ad un mare di informazioni,a volte contrastanti,che mi fanno perdere di vista il dubbio stesso che ho.
Se hai intenzione di continuare a programmare
no no appena finito con questi esami più di informatica non voglio più sentir parlare di algoritmi o linguaggi di programmazione :roll: :oops:
voglio avere una vita... :)
Va bene comunque, a questo punto, mi sento di mettere un bel risolto al titolo del topic.
Ringrazio nuovamente per l'aiuto che mi avete dato ragazzi...davvero siete fantastici!!!

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Puntatori chiarimenti

Messaggio da SlackNewbie »

Ah quasi dimenticavo... a proposito di sizeof,in un mio libro parla di funzione ecco perchè mi era venuto un dubbio.In effetti non gli vengono passati degli argomenti tra parentesi??
Essendo un operatore e non una funzione standard del C vuol dire che non ha un suo codice C (e tu albatros mi hai detto che queste funzioni hanno anche delle parti in assembly) ?
Forse sto diventando un po petulante...
Va bene chiudo per non andare offtopic!!!!

Rispondi