• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Puntatori

gedamial

Utente Senior
Autore del topic
9 Giugno 2010
1.937
69
Miglior risposta
0
Salve.

I miei dubbi riguardo i puntatori sono più di uno. Al termine di questa discussione desidererei annientarli uno per uno (non vi conviene offrirvi volontari :emoji_relieved:)

Allora, partiamo subito con questo codice:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Abbastanza intuibile. Ho creato una variabile n e un suo puntatore p. Cambio il valore della variabile n sfruttando proprio il puntatore (non avrei potuto fare altrimenti).

Il dubbio che mi rimane è dovuto al fatto che conosco un secondo codice che mi permette di fare ciò:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il puntatore qui è presente SOLO tra gli argomenti che la funzione cambiaValore vuole ricevere (*a). Nella main, quindi, non creo alcun puntatore. ANZI creo solamente la variabile! Solamente che quando la devo passare alla funzione cambiaValore, la passo usando la "&" (e commerciale).

Ragazzi... perchè??? Qual'è la maledetta differenza?

Per favore, cercate di spiegarmelo nel modo più semplice possibile :emoji_relieved:

Grazie in anticipo!
 
Non c'è molta differenza.

Il valore del puntatore è

&n

Nel primo caso questo valore lo memorizzi in p (e lo hai disponibile sempre in p) e lo passi alla funzione

Nel secondo caso non lo memorizzi ma solamente lo passi

Non mi pare un gran problema ... :-)

P.S. Non ti preoccupare ... posta tutti i dubbi che hai sui puntatori ...
 
  • Like
Reactions: 1 person
La & è un banalissimo operatore che restituisce l'indirizzo di una variabile.. In questo caso, usata su un int, restituisce un int*, che è esattamente il tipo che ti aspetti come parametro della funzione. :emoji_slight_smile:
 
  • Like
Reactions: 1 person
Non c'è molta differenza.

Il valore del puntatore è

&n

Nel primo caso questo valore lo memorizzi in p (e lo hai disponibile sempre in p) e lo passi alla funzione

Nel secondo caso non lo memorizzi ma solamente lo passi

Non mi pare un gran problema ... :-)

P.S. Non ti preoccupare ... posta tutti i dubbi che hai sui puntatori ...

Ti ringrazio! Cominciavo a preoccuparmi, credendo di aver "saltato" qualcosa per quanto riguarda i puntatori.

Non so perché, ma non ho più dubbi. Avevo quel dubbio sul petto che dovevo mandar via.

Grazie mille ^^

La & è un banalissimo operatore che restituisce l'indirizzo di una variabile.. In questo caso, usata su un int, restituisce un int*, che è esattamente il tipo che ti aspetti come parametro della funzione. :emoji_slight_smile:
In effetti ci avevo pensato al discorso che int restituisce int*

Tolto il dubbio, grazie ^^
 
Tutti qui i dubbi sui puntatori? Hai detto che ne avevi tanti ...

Uhm... vediamo... eccone uno!

Quando dichiaro un puntatore:
int *p;

Quando lo dichiaro come argomento di una funzione:
int funz (int *p);

Quando gli assegno un valore (come nel codice di esempio sopra):
*p = 10;

Quando devo passarlo ad una funzione:
funz(p);

Quando devo stamparlo:
cout << p << endl;

Negli ultimi due casi, dov'è finito l'asterisco?
 
Nella
int *p;
l'asterisco serve ad indicare che p è un puntatore (ad int).

Quando lo usi in questo modo nel programma
*p=10;
l'asterisco (operatore di dereferenziazione) indica il "contenuto puntato da p"

Quando usi semplicemente
p
intendi proprio il valore del puntatore (ovvero l'indirizzo dell'area di memoria puntata).
Quindi la cout << p serve a visualizzare il valore del puntatore, non del contenuto puntato da p.
 
Se fai count << p; non stampi il suo valore, attenzione...

Si è vero, scusa. Quella è la sua "cella di memoria" giusto?

- - - Aggiornato - - -
@nothing ah ecco! ho capito! Grazie!

Menomale che ci siete voi che ogni giorno/settimana subite le mie domande :emoji_relieved:

(e non parlo solo di voi due :emoji_slight_smile:)

Problema risolto!
 
Ultima modifica:
@TBH scusa se ti ho fatto mettere problema risolto, ma mi è sorto un piccolo dubbio stanotte. Scusami :soso: @nothing @Dvdxseo

Allora il mio dubbio è questo:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

In questo modo creo un array di stringhe. Io, di solito, gli array di stringhe li faccio così:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Che poi, tra l'altro, char è un tipo che supporta un solo carattere! Infatti, se tolgo l'operatore di dereferenziazione (*), il compilatore mi segnala errore.

Chiaritemi un attimo le idee :shock:
 
@HabboFanNumero1 Per dichiarare una stringa in C, ovvero un array di caratteri, puoi utilizzare anche char mystring[] = "stringa";

In quel caso è, appunto, un array di caratteri formato da

s, t, r, i, n, g, a

Io invece parlavo di array di stringhe in linguaggio C++ .
Infatti non riuscivo a capire perché nel codice n°1 si facesse in quel modo.
 
In questo modo creo un array di stringhe.

No, questo non è un array di stringhe.

E' un vettore di puntatori a stringhe costanti terminate da null. Ogni elemento del vettore prova, nel primo caso, è un indirizzo.

prova[0] è un indirizzo che punta alla sequenza di caratteri "TBH" e così via.

Le stringhe, in questo caso, non possono essere modificate (se provi a modificare un carattere di una stringa, hai un errore).

Questa riga la puoi scrivere anche in C.

Io, di solito, gli array di stringhe li faccio così:

Questa è un'altra storia e NON vale per il C ma solo per il C++.

In C++ string è una classe e quindi stai creando un vettore di 3 oggetti di classe string e stai inizializzando il loro contenuto.
Ma qui è tutta un'altra storia.
 
No, questo non è un array di stringhe.

E' un vettore di puntatori a stringhe costanti terminate da null. Ogni elemento del vettore prova, nel primo caso, è un indirizzo.

prova[0] è un indirizzo che punta alla sequenza di caratteri "TBH" e così via.

Le stringhe, in questo caso, non possono essere modificate (se provi a modificare un carattere di una stringa, hai un errore).

Aaah! Ecco spiegato perché l'asterisco. Ogni "elemento del vettore char" è, in realtà, un puntatore ad una stringa. Ma tu guarda xD


In C++ string è una classe e quindi stai creando un vettore di 3 oggetti di classe string e stai inizializzando il loro contenuto.
Ma qui è tutta un'altra storia.

Si infatti. E' per questo che includiamo l'header string.

Diciamo che se sento la necessità di creare un array di stringhe preferirei creare, appunto, 3 oggetti di classe string (anche se istanziare oggetti è una cosa da evitare per quanto riguarda il discorso della memoria, no?)
 
Diciamo che se sento la necessità di creare un array di stringhe preferirei creare, appunto, 3 oggetti di classe string

Decidi se lavorare in C (non puoi usare la classe string) o in C++ (allora è consigliabile usare gli oggetti string)

(anche se istanziare oggetti è una cosa da evitare per quanto riguarda il discorso della memoria, no?)

Questa non l'ho capita ...
 
Aaah! Ecco spiegato perché l'asterisco. Ogni "elemento del vettore char" è, in realtà, un puntatore ad una stringa. Ma tu guarda xD




Si infatti. E' per questo che includiamo l'header string.

Diciamo che se sento la necessità di creare un array di stringhe preferirei creare, appunto, 3 oggetti di classe string (anche se istanziare oggetti è una cosa da evitare per quanto riguarda il discorso della memoria, no?)

no , a dire il vero in C++ se esiste la classe string è perché semplifica la gestione di una sequenza di caratteri grazie ai metodi presenti in quest'ultima. Ovviamente in C string non esiste e si usa un puntatore di tipo char.
 
Da qualche parte ho letto (non ricordo dove precisamente, mi pare stack overflow) che istanziare oggetti è da evitare QUANDO E' POSSIBILE perché, appunto, appesantiscono il programma.

Beh ... è un discorso che ha poco senso. E' come dire, se puoi evitare di andare in auto, non la prendere; usala solo quando ti serve (!!!)
 
  • Like
Reactions: 1 person
Da qualche parte ho letto (non ricordo dove precisamente, mi pare stack overflow) che istanziare oggetti è da evitare QUANDO E' POSSIBILE perché, appunto, appesantiscono il programma.

Avrai letto male, credo che questo discorso abbia a che fare con la consapevolezza che chi scrive il programma deve scriverlo in modo intelligente senza utilizzare classi, variabili, oggetti o metodi che appesantiscano inutilmente il programma. Secondo il tuo ragionamento, in C++, se voglio utilizzare una stringa allora per risparmiare memoria anziché utilizzare string utilizzo un array di caratteri ma se così fosse allora non staremo più lavorando in C++ ma in C perché le stringhe, e tutte le relative operazioni su di esse, vengono gestite in C come un array di caratteri, dunque dove sarebbe l'evoluzione del linguaggio C ? Sì ok risparmio memoria ma allora che esiste a fare string ? Bisogna saper programmare, questo è il punto.
 
  • Like
Reactions: 1 person