Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460

    [C] Questo è un puntatore di puntatore?

    codice:
    char *p;
    p="Ciao Mondo";
    p diventa un puntatore a puntatore?

  2. #2
    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.

  3. #3
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    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 *)
    perché dovrebbe? perché per quanto ne so è un puntatore, o meglio la stringa "Ciao Mondo" è data in "gestione" ad un puntatore.

    codice:
    #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.

  4. #4
    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:
    codice:
    #include <stdio.h>
    
    int main()
    {
        puts("Hello World!");
    }
    è come se scrivessi:
    codice:
    #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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    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:
    codice:
    #include <stdio.h>
    
    int main()
    {
        puts("Hello World!");
    }
    è come se scrivessi:
    codice:
    #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?

  6. #6
    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!
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    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

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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.