2012-03-12 14 views
5

En C++, tengo una matriz de caracteres define como:C++, Hacer un puntero a una matriz de caracteres

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

Quiero modificar los valores de esta matriz a partir de otras funciones sin pasar a esas funciones. Aquí es donde usas punteros ¿verdad?

Así que mi pregunta es cuál es la forma correcta de hacer un puntero a esta matriz de caracteres. ¿Acabo de hacer un puntero al primer elemento y luego, cuando quiero modificar los valores, paso por la memoria hasta que toco el carácter final?

+0

Acabo de ver esto, sí mucho mejor que \ 0.Gracias –

Respuesta

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

Estos son equivalentes.

char *p1 = miniAlphabet; 

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

Nota que el () son inútiles para la precedencia de los operadores, de modo

char *p3 = &miniAlphabet[0]; 

en C/C++ el nombre de una matriz es un puntero al primer elemento de la matriz.

A continuación, puede usar las matemáticas punteros hacer un poco de magia ...

Este apuntará al segundo elemento:

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

como

char *p5 = &miniAlphabet[1]; 

o

char *p6 = miniAlphabet + 1; 
+0

Gracias por la edición, v.clear. –

+0

Hola, tengo una pregunta rápida. cuando haces char * p1 = miniAlphabet, p1 ahora almacena la dirección del primer elemento de la matriz. ¿Cómo es que, cuando hacemos cout << p1 << endl, obtenemos toda la matriz de caracteres (en este caso ABCDE) y no la dirección del primer elemento? –

+0

@DannyBrown Porque el creador de * cout * así lo decidió. Incluso podría haber escrito siempre "hello world" para cualquier puntero char *, pero hubiera sido estúpido. Lo más inteligente que debe hacer si está en la profesión de escribir texto, es imprimir un char * como una cadena. Si desea imprimir una dirección de puntero, realice un * << static_cast (p1) * – xanatos

1

El po La ubicación de la matriz en la memoria es la misma que la posición de su primer elemento. Así, por ejemplo, dos firmas de función son equivalentes a continuación:

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

y se puede llamar a cualquiera de las versiones de esta manera:

changeArray(miniAlphabet); 

... o

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

. Tenía la impresión de que un char * es una constante en la declaración. Siendo este el caso, ¿la segunda función no podría cambiar nada sobre la matriz de caracteres, mientras que la primera sí podría? – MintyAnt

+0

No puede cambiar el valor de un carácter * dentro de la función, pero puede cambiar el valor al que apunta, en este caso, el conjunto. Entonces ambas declaraciones permiten cambios a la matriz original. – Diego

1

Si se pasa una matriz a una función, usted pasa por referencia ya que una variable de matriz es realmente solo un puntero a la dirección del primer elemento en la matriz. Así que usted puede llamar a una función como esta:

funcName(miniAlphabet); 

y recibir la matriz "por referencia" de esta manera:

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

En resumen, sí. Cuando crea la matriz miniAlphabet es un puntero a la matriz del tamaño y tipo que definió. Que también es el puntero al primer elemento.

Un ejemplo de lo que está sugiriendo.

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

... 

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

también de la nota, desreferenciando myArray le da el valor en el primer elemento.

Cuestiones relacionadas