2012-03-12 16 views
5

In C++, ho un array di char definito come:C++, Fare un puntatore a una matrice char

char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

voglio modificare i valori di questa matrice da altre funzioni senza passare per tali funzioni. Questo è dove usi i puntatori giusto?

Quindi la mia domanda è qual è il modo corretto per creare un puntatore a questo array di caratteri. Dovrei semplicemente fare un puntatore al primo elemento e poi quando voglio modificare i valori passo alla memoria finché non colpisco il carattere finale?

+0

Ho appena controllato, sì molto meglio di \ 0.Grazie –

risposta

14
char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

Questi sono equivalenti.

char *p1 = miniAlphabet; 

char *p2 = &(miniAlphabet[0]); 

noti che il () sono inutili per la precedenza degli operatori, così

char *p3 = &miniAlphabet[0]; 

In C/C++ il nome di un array è un puntatore al primo elemento della matrice.

È quindi possibile utilizzare la matematica puntatori a fare un po 'di magia ...

Questo puntare al secondo elemento:

char *p4 = &miniAlphabet[0] + 1; 

come

char *p5 = &miniAlphabet[1]; 

o

char *p6 = miniAlphabet + 1; 
+0

Grazie per la modifica, v.clear. –

+0

Ciao, ho una domanda veloce. quando fai char * p1 = miniAlphabet, p1 memorizza ora l'indirizzo del primo elemento dell'array. Come mai, quando facciamo cout << p1 << endl, otteniamo l'intero array di caratteri (in questo caso ABCDE) e non l'indirizzo del primo elemento? –

+0

@DannyBrown Perché il creatore di * cout * ha deciso così. Potrebbe anche aver sempre scritto "ciao mondo" per qualsiasi puntatore char *, ma sarebbe stato stupido. La cosa più intelligente da fare se sei nella professione di scrivere testo, è stampare un char * come stringa. Se si desidera stampare un indirizzo puntatore, fare un * << statico_cast (p1) * – xanatos

1

Il po la sizione dell'array in memoria è uguale alla posizione del suo primo elemento. Così, per esempio, entrambe le firme funzione qui sotto sono equivalenti:

function changeArray(char[] myArray); 
function changeArray(char* myArray); 

e si può chiamare entrambe le versioni come questo:

changeArray(miniAlphabet); 

... o

changeArray(&(miniAlphabet[0])); 
+0

Ho avuto l'impressione che un char * sia una costante sulla dichiarazione. Stando così le cose, la seconda funzione non sarebbe in grado di cambiare nulla riguardo al char array, mentre il primo può? – MintyAnt

+0

Non è possibile modificare il valore di un char * all'interno della funzione, ma è possibile modificare il valore a cui punta, in questo caso, la matrice. Quindi entrambe le dichiarazioni consentono modifiche all'array originale. – Diego

1

Se si passa una matrice per una funzione, si sta passando per riferimento come una variabile di matrice è in realtà solo un puntatore all'indirizzo del primo elemento nella matrice. Così si può chiamare una funzione come questa:

funcName(miniAlphabet); 

e ricevere la matrice "di riferimento" come questo:

void funcName(char *miniAlphabet) { 
    ... 
} 
1

In breve, sì. Quando si crea l'array miniAlphabet è un puntatore all'array della dimensione e del tipo definiti. Quale è anche il puntatore al primo elemento.

Un esempio di ciò che stai suggerendo.

void foo(char *array) 
{ 
    array[0] = 'z'; 
    array[2] = 'z'; 
} 

... 

char myArray[] = { 'a', 'b', 'c'}; 
foo(myArray); 
//myArray now equals {'z', 'b', 'z'} 

anche nota, dereferenziazione myArray fornisce il valore nel primo elemento.

Problemi correlati