PDA

Visualizza la versione completa : [C] Puntatore di puntatore e stringhe


Freax
21-08-2011, 20:59
char *p;
p="Ciao Mondo";

p diventa un puntatore a puntatore?

MItaly
21-08-2011, 21:15
Perché dovrebbe? :confused:
"Ciao Mondo" è uno string literal, e quindi un puntatore ad una stringa che sta da qualche parte in memoria, e il suo tipo è char *. Nel momento in cui lo assegni a p non succede nulla di strano: p semplicemente punterà alla stringa "Ciao Mondo".
Per inciso, il C è un linguaggio a tipizzazione statica, dopo che hai dichiarato una variabile questa non può cambiare di tipo, quindi dire che p "diventa" un puntatore a puntatore non ha molto senso.

(comunque, sarebbe meglio usare const char *, visto che gli string literal non vanno modificato pena undefined behavior - e non a caso in C++ il tipo degli string literal è const char *)

Freax
21-08-2011, 21:18
Originariamente inviato da MItaly
Perché dovrebbe? :confused:
"Ciao Mondo" è uno string literal, e quindi un puntatore ad una stringa che sta da qualche parte in memoria, e il suo tipo è char *. Nel momento in cui lo assegni a p non succede nulla di strano: p semplicemente punterà alla stringa "Ciao Mondo".
Per inciso, il C è un linguaggio a tipizzazione statica, dopo che hai dichiarato una variabile questa non può cambiare di tipo, quindi dire che p "diventa" un puntatore a puntatore non ha molto senso.

(comunque, sarebbe meglio usare const char *, visto che gli string literal non vanno modificato pena undefined behavior - e non a caso in C++ il tipo degli string literal è const char *)

perché dovrebbe? perché per quanto ne so è un puntatore, o meglio la stringa "Ciao Mondo" è data in "gestione" ad un puntatore.


#include <stdio.h>

int main(){
printf("\n%p\n","Ciao Mondo");
}


se fosse solo una costante dovrebbe darmi errore, giusto? Se tratto quella costante come puntatore non mi segna nessun errore, neanche 1 warning.

MItaly
21-08-2011, 21:26
Originariamente inviato da Freax
perché dovrebbe? perché per quanto ne so è un puntatore, o meglio la stringa "Ciao Mondo" è data in "gestione" ad un puntatore.
Ma infatti è un puntatore (come ho detto), quello che non capisco è perché tu creda che sia un puntatore doppio...

Credo che alla fine il modo più semplice per capire cosa siano gli string literals è vedere la definizione dello standard (C99, §6.4.5, ¶5), che in sintesi dice che gli string literal altro non sono che delle stringhe (array di char) globali, a cui ti viene dato un puntatore la cui modifica è proibita. Ossia, se tu scrivi:


#include <stdio.h>

int main()
{
puts("Hello World!");
}

è come se scrivessi:


#include <stdio.h>

char VariabileNascosta[]={'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0};

int main()
{
puts(VariabileNascosta);
}

con la restrizione aggiuntiva che cercare di modificare VariabileNascosta risulta in undefined behavior.

Freax
21-08-2011, 21:36
Originariamente inviato da MItaly
Ma infatti è un puntatore (come ho detto), quello che non capisco è perché tu creda che sia un puntatore doppio...

Credo che alla fine il modo più semplice per capire cosa siano gli string literals è vedere la definizione dello standard (C99, §6.4.5, ¶5), che in sintesi dice che gli string literal altro non sono che delle stringhe (array di char) globali, a cui ti viene dato un puntatore la cui modifica è proibita. Ossia, se tu scrivi:


#include <stdio.h>

int main()
{
puts("Hello World!");
}

è come se scrivessi:


#include <stdio.h>

char VariabileNascosta[]={'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0};

int main()
{
puts(VariabileNascosta);
}

con la restrizione aggiuntiva che cercare di modificare VariabileNascosta risulta in undefined behavior.

io ho un mio puntatore p, ho un secondo puntatore che mi punta al contenuto "Ciao Mondo", se assegno a p il secondo puntatore cosa dovrei ottenere se non un puntatore a puntatore?

MItaly
21-08-2011, 22:15
Originariamente inviato da Freax
io ho un mio puntatore p, ho un secondo puntatore che mi punta al contenuto "Ciao Mondo", se assegno a p il secondo puntatore cosa dovrei ottenere se non un puntatore a puntatore?
Perché mai? Hai un puntatore a char, lo memorizzi in una variabile puntatore a char, resta del tipo puntatore a char. Non c'è nessun & o *, il tipo dell'espressione resta sempre lo stesso!

Freax
22-08-2011, 07:40
Originariamente inviato da MItaly
Perché mai? Hai un puntatore a char, lo memorizzi in una variabile puntatore a char, resta del tipo puntatore a char. Non c'è nessun & o *, il tipo dell'espressione resta sempre lo stesso!

mi son perso la & nel mio discorso, ho aperto un thread per nulla, sorry :fagiano:

grazie comunque per le risposte, stamattina ho riaperto codeblocks e mi son chiesto perché io abbia aperto un topic del genere, è la vita :D

Loading