p diventa un puntatore a puntatore?codice:char *p; p="Ciao Mondo";
p diventa un puntatore a puntatore?codice:char *p; p="Ciao Mondo";
Perché dovrebbe?
"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 *)
Amaro C++, il gusto pieno dell'undefined behavior.
perché dovrebbe? perché per quanto ne so è un puntatore, o meglio la stringa "Ciao Mondo" è data in "gestione" ad un puntatore.Originariamente inviato da MItaly
Perché dovrebbe?
"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 *)
se fosse solo una costante dovrebbe darmi errore, giusto? Se tratto quella costante come puntatore non mi segna nessun errore, neanche 1 warning.codice:#include <stdio.h> int main(){ printf("\n%p\n","Ciao Mondo"); }
Ma infatti è un puntatore (come ho detto), quello che non capisco è perché tu creda che sia un puntatore doppio...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.
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:
è come se scrivessi:codice:#include <stdio.h> int main() { puts("Hello World!"); }
con la restrizione aggiuntiva che cercare di modificare VariabileNascosta risulta in undefined behavior.codice:#include <stdio.h> char VariabileNascosta[]={'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0}; int main() { puts(VariabileNascosta); }
Amaro C++, il gusto pieno dell'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?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:
è come se scrivessi:codice:#include <stdio.h> int main() { puts("Hello World!"); }
con la restrizione aggiuntiva che cercare di modificare VariabileNascosta risulta in undefined behavior.codice:#include <stdio.h> char VariabileNascosta[]={'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0}; int main() { puts(VariabileNascosta); }
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!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?
Amaro C++, il gusto pieno dell'undefined behavior.
mi son perso la & nel mio discorso, ho aperto un thread per nulla, sorryOriginariamente 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!![]()
grazie comunque per le risposte, stamattina ho riaperto codeblocks e mi son chiesto perché io abbia aperto un topic del genere, è la vita![]()