2015-12-05 16 views
5

Di solito quando si dichiara un puntatore (come ad esempio un int) che avrebbe dovuto assegnare un indirizzo di memoria ad esso:Perché è possibile assegnare un array a un puntatore char?

int value = 123; 
int* p = &value; 

Quando si crea un puntatore char, è possibile assegnare un array di caratteri ad esso senza il necessità di inserire un indirizzo:

char* c = "Char Array"; 

Come funziona? Alloca memoria e punta a quello? Perché gli altri puntatori di tipo non possono fare la stessa cosa?

+0

Non è possibile farlo ad esempio: 'char * c = &'a';' –

+0

Si noti che 'char * c =" char array "' non verrà compilato in C++; volevi chiedere di C, invece? – edmz

+0

@Daniel Il compilatore C++ fa schifo se non ti dà almeno un avvertimento. –

risposta

7

Come funziona?

La stringa letterale viene memorizzato in una sezione di dati di sola lettura nel file eseguibile (il che significa che viene inizializzato durante la compilazione) e c viene inizializzato per puntare a quella posizione di memoria. L'implicito array-to-pointer conversion gestisce il resto.

Si noti che la conversione di stringhe letterali in char* è deprecata perché i contenuti sono di sola lettura in ogni caso; preferire const char* quando si punta a stringhe letterali.

Un costrutto correlato, char c[] = "Char Array";, copia il contenuto della stringa letterale nell'array char in fase di esecuzione.

Perché gli altri puntatori di tipo non possono fare la stessa cosa?

Questo è un caso speciale per stringhe, per comodità, ereditato da C.

1

altri puntatori tipo può fare anche questo bene. Una stringa letterale è una matrice di caratteri, quindi non è necessario utilizzare l'operatore dell'indirizzo per assegnare al puntatore.

Se si ha un array intero, sia int * o int [] è possibile assegnare a int puntatore senza utilizzare l'operatore indirizzo così:

int intArray1[] = {0, 1, 2}; // fist array 
int * intArray2 = new int[10]; // second array 
// can assign without & operator 
int * p1 = intArray1; 
int * p2 = intArray2; 

Il char * è proprio specifica che il tipo letterale stringa è in realtà const char * ed è ancora consentito assegnare (con un avviso sulla conversione deprecato).

Problemi correlati