Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Un ultima domanda OT:

    Un char * ed un char [], sono la stessa cosa?
    Ho fatto un po di prove, ma gradirei qualche altra spiegazione:

    codice:
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char x[] = "hello world!";
        char *z = "hello world!";
        cout << x << "\n" << *x << "\n" << z << endl << *z << endl    << x[3] << endl << z[3] << endl;
    	
    	
    	
    	
    	return 0;
    	
    	}
    -Perchè poi, quando chiedo di stampare "x", scrive tutta la stringa, anzichè l'indirizzo?
    -Perchè non posso fare, ad esempio: int *x = 23?

    Grazie ancora.

  2. #2

    Moderazione

    Originariamente inviato da signoredeltempo
    Un ultima domanda OT:
    Dato che la domanda non c'entra nulla con il contenuto originale del thread, separo il post in una nuova discussione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da signoredeltempo
    Un char * ed un char [], sono la stessa cosa?
    Dipende.

    In primo luogo, il tipo char[] non esiste. Possono esserci due cose:
    1. definizione di un array di char (di dimensione fissata) in cui la dimensione non viene esplicitamente scritta, ma viene dedotta dal compilatore dalla stringa con cui viene inizializzato;
    2. passaggio di char[] come argomento di una funzione.

    Caso 1: se scrivi
    codice:
    char x[]="abcde";
    è come se scrivessi
    codice:
    char x[6]={'a', 'b', 'c', 'd', 'e', 0);
    semplicemente lasci che sia il compilatore a smazzarsi il lavoro di contare i caratteri, imporre all'array le dimensioni corrette e aggiungere il terminatore di stringa.

    Nota che questo è diversissimo dallo scrivere:
    codice:
    char * x="abcde";
    In questo caso tu non stai dichiarando un array, ma un puntatore; questo puntatore viene inizializzato con l'indirizzo della stringa "abcde", situata altrove in memoria. Nota che lo standard proibisce di modificare tali stringhe (normalmente sono poste in aree di memoria di sola lettura), per cui la sintassi corretta in effetti è
    codice:
    const char * x="abcde";
    con il const che fa sì che il compilatore ti avvisi a compile-time se stai cercando di modificare la stringa in questione.

    Quindi, in sostanza, la differenza fondamentale è che in un caso dichiari un array locale alla tua funzione, in cui è contenuta la stringa, e su cui puoi fare tutte le operazioni che ti pare; nell'altro invece semplicemente ottieni un puntatore che contiene l'indirizzo della tua stringa, che però non puoi modificare.

    Caso 2:
    se dichiari una funzione come
    codice:
    void test(char[] c);
    questa viene automaticamente trasformata in
    codice:
    void test(char * c);
    per cui quando passi un array di char ad una funzione di questo tipo, di fatto stai passando semplicemente un puntatore al suo primo elemento.
    (nota che queste considerazioni valgono per array di qualunque tipo)
    -Perchè poi, quando chiedo di stampare "x", scrive tutta la stringa, anzichè l'indirizzo?
    Per comodità. Normalmente se hai un char * vuoi stamparlo come stringa, piuttosto che come indirizzo. Se insisti per volerlo stampare come indirizzo, nulla ti impedisce di fare un cast a void *, che fa sì che ne venga stampato semplicemente l'indirizzo:
    codice:
    char x[]="hello world";
    cout<<(void *)x;
    -Perchè non posso fare, ad esempio: int *x = 23?
    Perché non ha senso; non puoi inizializzare un puntatore ad intero con un intero. Semmai, potresti voler inizializzare un puntatore ad intero con l'indirizzo di un array di interi creato "di nascosto" dal compilatore, in maniera simile a quanto accade con i char *; lo standard tuttavia non prevede questa possibilità, semplicemente perché accade di rado che sia utile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Stavo giusto per scrivere di non rispondere; è l'argomento successivo
    Grazie comunque MItaly.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.