PDA

Visualizza la versione completa : [C++] Stringhe e puntatori


zaxis
22-12-2005, 20:42
Il puntatore contiene sempre e solo l'indirizzo della variabile a cui punta, giusto?
Se lo stampo senza deferenziarlo, mi dovebbe dunque fornire un indirizzo di memoria...

Cosa c'e' di sbagliatonel codicequi sotto??
Come fa il primo elemento dell'array ad avere indirizzo "ciao pippo" ??????

Grazie!





#include <iostream>

using namespace std;

void stampa(char *b){
cout << "b = " << b << endl ;//mi stampa l'indirizzo contenuto nel puntatore *b, cioè...'pippo ciao'!
cout << "*b = " << *b;//mi stampa il contenuto dell'indirizzo puntato da b, cioè....p!
}



int main () {
char *a;
//assegna al puntatore l'indirizzo del primo elemento dell'array {"p","i","p","p","o"," ","c","i","a","o"}
a = "pippo ciao";
std::cout << "a = " << a << endl; //l'indirizzo di "p" è...'pippo'!!!
stampa(a);//passo l'indirizzo alla funzione stampa
return 0;
}

oregon
22-12-2005, 21:16
Devi scrivere

cout << "b = " << (int)b << endl;

e

cout << "a = " << (int)a << endl;

per indicare che vuoi visualizzare le variabili come valore numerico

zaxis
22-12-2005, 23:37
Grazie!
Si tratta di una specie d casting?

Ma vorrei capire il perche'...

se dichiaro un puntatore di qualsiasi tipo, diciamo di tipo
"ciccio", e dichiaro una variabile di tipo "ciccio", il puntatore conterrà sempre e solo l'indirizzo della variabile:

ciccio *a;
ciccio b;
a = &b;

Ora so che per i char e' diverso: dichiarare

char *a;
a = "pippo";

e' come passare un array ["p","i","p","p","o"}, per cui dentro il puntatore dovrebbe finirci l'indirizzo
del primo elemento, "p"...

Ed infatti mi aspetto di vedere proprio l'indirizzo del primo elemento, ma invece ottengo tutta la stringa.

Vorrei capire la teoria che c'e' dietro...come puo' un puntatore contenere la stringa anziche' l'indirizzo di memoria????

Ciao!

oregon
23-12-2005, 01:51
La cosa e' molto piu' semplice di quello che credi.

Non e' la variabile puntatore che contiene la stringa (e' sbagliato dire una cosa del genere, in quanto la variabile puntatore contiene sempre l'indirizzo per puntare alla stringa).

Il fatto e' di "come" viene interpretata la variabile dall'entita' che visualizza il dato.

La cout, se non specifichi che il dato deve essere "interpretato" numericamente, sapendo che e' un puntatore a char, ne mostra automaticamente il "valore" puntato.

Con la printf ti renderai conto meglio che il dato puo' essere interpretato come meglio si crede. Con questa funzione lo si fa attraverso il codice di formattazione passato come argomento.
Nel tuo codice per esempio, se scrivi

printf("%s", a);

stai indicando al compilatore che a deve essere interpretato come puntatore a una stringa e che bisogna visualizzare tale stringa. Questo comporta la generazione automatica di codice tale che si accede al contenuto puntato dal puntatore e non al suo valore.
Se pero' scrivi

printf("%p", a);

oppure

printf("%x", a);

stai indicando al compilatore di generare il codice atto a visualizzare il valore del puntatore stesso e non il valore puntato, e visualizzarlo in esadecimale.

zaxis
23-12-2005, 09:12
Grazie ancora!
Era finalmente e' tutto chiaro...

Immagino che la cosa (quando e' un char* prendere direttamente la variabile puntata) non valga solo per cout, ma per la maggior parte (tutte?) le funzioni che prendono le stringhe come argomento...
giusto?

Ciao!

oregon
23-12-2005, 10:51
cout e' un oggetto e quindi il suo comportamento dipende da come e' stato implementato l'operatore >> per tale oggetto.

Per le funzioni il discorso cambia. In genere il tipo di parametro e' indicato dalle funzioni. E' un discorso che non puo' essere fatto in generale ma caso per caso.

zaxis
23-12-2005, 12:56
OK...argomento esaurito.
Grazie!!!

Loading