[C++] Esercizio puntatori
Ciao a tutti, sono un nuovo utente (anche se ho avuto già modo di bazzicare tra i topic di matematica), spinto su questo forum dalla necessità: a breve dovrò dare un esame di informatica e il mio livello attuale è pessimo. Spero dunque che non sia un problema se posterò una valanga di domande nei prossimi giorni
Per esempio, ho questo esercizio:
Allora, esaminiamo il codice: inizialmente viene dichiarato un vettore di dimensione $100$ formato da dati di tipo int. Dopodiché sono dichiarati due puntatori, ovvero variabili il cui contenuto è un indirizzo di memoria.
Adesso, cominciando dalla prima richiesta voglio assegnare a indint l'indirizzo del primo dato del vettore. Allora, so che in generale per fare questa cosa si usa l'operatore di estrazione dell'indirizzo $&$, e quindi devo scrivere una roba nella forma indint=&(inizio del vettore). E' corretto dire quindi che il codice finale sarà
e quindi analogamente per la seconda parte
Poi, la seconda domanda: stiamo usando, perdonate se la sparo grossa, l'operatore di dereferenziazione. Quello che succede quindi è che visualizzo l'entità a cui * fa riferimento. In questo caso, visualizza ciò a cui punta (vett+3). Se non sbaglio vett+3 è il vettore originario a cui sommo componente per componente tre unità intere, quindi sostanzialmente l'inizio del vettore è traslato a vett[3] e la fine a vett[103]. Questo è corretto, e se sì, risponde alla domanda?
La terza invece mi disorienta. Stiamo dichiarando un float che è uguale alla somma di due elementi del vettore. Premesso che sia una scrittura corretta, e già questo non lo so, come faccio a capire quanto vale effettivamente se non conosco il valore associato a tali componenti dell'array?
So che sono molte domande, ma sono un completo novellino... spero qualcuno abbia la pazienza di rispondermi
grazie mille in anticipo!
P.S. c'è un modo per scrivere il codice sulla stessa riga? o mi devo limitare a scrivere in corsivetto?

Per esempio, ho questo esercizio:
Dati
int vett[100]; int * indint1, * end
assegnare a indint l'indirizzo di inizio del vettore e a end l'indirizzo del suo ultimo elemento.
Cosa significa *(vett+3)? E' corretto scrivere float x = vett[99] + vett[100];? Se sì, quanto vale x?
Allora, esaminiamo il codice: inizialmente viene dichiarato un vettore di dimensione $100$ formato da dati di tipo int. Dopodiché sono dichiarati due puntatori, ovvero variabili il cui contenuto è un indirizzo di memoria.
Adesso, cominciando dalla prima richiesta voglio assegnare a indint l'indirizzo del primo dato del vettore. Allora, so che in generale per fare questa cosa si usa l'operatore di estrazione dell'indirizzo $&$, e quindi devo scrivere una roba nella forma indint=&(inizio del vettore). E' corretto dire quindi che il codice finale sarà
indint = &vett[0];
e quindi analogamente per la seconda parte
end = &vett[100];?
Poi, la seconda domanda: stiamo usando, perdonate se la sparo grossa, l'operatore di dereferenziazione. Quello che succede quindi è che visualizzo l'entità a cui * fa riferimento. In questo caso, visualizza ciò a cui punta (vett+3). Se non sbaglio vett+3 è il vettore originario a cui sommo componente per componente tre unità intere, quindi sostanzialmente l'inizio del vettore è traslato a vett[3] e la fine a vett[103]. Questo è corretto, e se sì, risponde alla domanda?
La terza invece mi disorienta. Stiamo dichiarando un float che è uguale alla somma di due elementi del vettore. Premesso che sia una scrittura corretta, e già questo non lo so, come faccio a capire quanto vale effettivamente se non conosco il valore associato a tali componenti dell'array?
So che sono molte domande, ma sono un completo novellino... spero qualcuno abbia la pazienza di rispondermi

P.S. c'è un modo per scrivere il codice sulla stessa riga? o mi devo limitare a scrivere in corsivetto?
Risposte
Allora...
Per quanto riguarda la prima richiesta, come hai giustamente detto, è possibile usare l'operatore &, ma in realtà si potrebbe anche non utilizzarlo. Un array infatti non è altro che un puntatore che punta al primo elemento dell'array e quindi risulta equivalente scrivere:
indint = &vett[0]
end = &vett[99]
e
indint = vett
end = vett + 99
Qui c'è un errore, infatti se l'array contiene 100 elementi e il primo ha indice 0, allora l'ultimo avrà indice 99 e non 100.
Per quanto riguarda la seconda richiesta si ha, tenendo presente l'operatore di dereferenziazione e l'aritmetica dei puntatori, che *(vett+3) coincide con la scrittura vett[3]. Quindi nessun vettore viene traslato.
Per quanto riguarda la terza richiesta ora non posso dilungarmi, ma ti consiglio di leggerti qualcosa sul casting e di ricordarti (come detto sopra) che v[100] non appartiene all'array e quindi v[100] assumerà un valore casuale.
Per quanto riguarda la prima richiesta, come hai giustamente detto, è possibile usare l'operatore &, ma in realtà si potrebbe anche non utilizzarlo. Un array infatti non è altro che un puntatore che punta al primo elemento dell'array e quindi risulta equivalente scrivere:
indint = &vett[0]
end = &vett[99]
e
indint = vett
end = vett + 99
e quindi analogamente per la seconda parte
end = &vett[100];
?
Qui c'è un errore, infatti se l'array contiene 100 elementi e il primo ha indice 0, allora l'ultimo avrà indice 99 e non 100.
Per quanto riguarda la seconda richiesta si ha, tenendo presente l'operatore di dereferenziazione e l'aritmetica dei puntatori, che *(vett+3) coincide con la scrittura vett[3]. Quindi nessun vettore viene traslato.
Per quanto riguarda la terza richiesta ora non posso dilungarmi, ma ti consiglio di leggerti qualcosa sul casting e di ricordarti (come detto sopra) che v[100] non appartiene all'array e quindi v[100] assumerà un valore casuale.
"Super Squirrel":
Qui c'è un errore, infatti se l'array contiene 100 elementi e il primo ha indice 0, allora l'ultimo avrà indice 99 e non 100.
Hai perfettamente ragione, proprio non mi va giù questa cosa che si inizia sempre dallo 0...
"Super Squirrel":
*(vett+3) coincide con la scrittura vett[3]. Quindi nessun vettore viene traslato.
Aspetta. (vett+3) non somma 3 a ogni componente del vettore? Come fai a dire quindi che coincide con vett[3], che è solo un elemento dell'array?
Per il terzo punto, come giustamente mi hai ricordato vett[100] ha un valore casuale. Il casting sarebbe l'assegnazione manuale di un tipo al risultato di un'operazione, giusto? Quindi in questo caso stiamo imponendo che il risultato sia un float.
Il fatto che vett[100] non sia definito basta ad afferamare che quella frase non ha senso?
Grazie per l'attenzione e le tue risposte, Super Squirrel!
Aspetta. (vett+3) non somma 3 a ogni componente del vettore? Come fai a dire quindi che coincide con vett[3], che è solo un elemento dell'array?
Spesso la cosa migliore è fare delle prove e vedere cosa succede. Dopo averlo letto, prova a compilare e ad eseguire il seguente codice:
#include <iostream> using namespace std; int main() { int v[5] = {3, 4, 5, 6, 7}; cout << v << " - " << &v[0] << endl; cout << v + 1 << " - " << &v[1] << endl; cout << v[0] << " - " << *v << endl; cout << v[4] << " - " << *(v + 4) << endl; }
Per alcuni dubbi ti consiglio di consultare il seguente sito, è davvero ben fatto:
http://www.bo.cnr.it/corsi-di-informati ... ml#virtual
Relativamente al precedente dubbio vedi il capitolo Puntatori ed Array.
Per quanto riguarda il casting vedi il paragrafo Operatori e operandi/Conversioni di tipo.
Credo di esserci. Ti ringrazio per il link, il sito sembra ottimo, anche se vastissimo! In tre giorni dubito di riuscire a leggerne molto
