Arrays y punteros en c ++

El nombre de la matriz es un puntero a la propia matriz. los array es una secuencia de variables almacenadas en la memoria. los nombre de la matriz apunta al primer elemento.

Esta es una pregunta interesante sobre punteros: ¿Se puede tener un encabezado de la función, como la línea siguiente y sólo tiene que utilizar tamaño de para determinar cuántos elementos hay en la matriz? Si es así, esta función no tendría que tener la persona que llama especificar el tamaño de la matriz.

int AddUp (int Números []) {

Considere esta función se encuentra en la Array01 y un ejemplo main () que lo llama:

anular ProcessArray (Números int []) {cout lt; lt; "Función de Interior: Tamaño en bytes es" lt; lt; sizeof (Números) lt; lt; endl-} int main (int argc, char * argv []) {int MyNumbers [] = {} 1,2,3,4,5,6,7,8,9,10 -cout lt; lt; "Función Exterior: Tamaño en bytes es" -cout lt; lt; sizeof (MyNumbers) lt; lt; endl-ProcessArray (MyNumbers) -Retorno 0-}

Al ejecutar esta aplicación, esto es lo que se ve:

Función Exterior: Tamaño en bytes es función 40Inside: Tamaño en bytes es 4

Fuera de la función, el código sabe que el tamaño de la matriz es de 40 bytes. Pero ¿por qué el código de pensar que el tamaño es de 4 después de que esté dentro de la matriz? La razón es que a pesar de que parece que estás pasando un array, en realidad está pasando un puntero a una matriz. El tamaño del puntero es 4, por lo que eso es lo que la final cout grabados de línea.

Declarar matrices tiene una ligera idiosincrasia. Cuando se declara una matriz por dar un número determinado de elementos, tales como

int MyNumbers [5] -

el compilador sabe que tiene una matriz, y la tamaño de operador le da el tamaño de toda la matriz. El nombre de la matriz es, pues, ambas cosas un puntero y un arsenal! Pero si se declara un encabezado de la función sin un tamaño de la matriz, tales como

anular ProcessArray (int Números []) {

los compilador trata esto como una simple puntero y nada mas. Esta última línea es, de hecho, equivalente a la siguiente línea:

anular ProcessArray (Números int *) {

Por lo tanto, dentro de las funciones que, o bien la línea declara, las siguientes dos líneas de código son equivalente:

Números [3] = 10 - * (Números + 3) = 10-

Esta equivalencia significa que si se utiliza un externo declaración sobre una matriz, tales como

int MyNumbers extern [] -

y luego tomar el tamaño de este array, el compilador confundirse. He aquí un ejemplo: si tiene dos archivos, numbers.cpp y main.cpp, dónde numbers.cpp declara una matriz y main.cpp externamente declara que (como se muestra en la Array02 ejemplo), obtendrá un error de compilación si llamas tamaño de:

#include using namespace std-extern int MyNumbers [] - int main (int argc, char * argv []) {cout lt; lt; sizeof (MyNumbers) lt; lt; endl retorno 0-}

En Code :: Blocks, el compilador gcc nos da este error:

error: aplicación inválida de "sizeof 'al tipo incompleto' int [] '

La solución es poner el tamaño de la matriz dentro de los paréntesis. Sólo asegúrese de que el tamaño es el mismo que en el otro archivo de código fuente! Usted puede fingir el compilador cambiando el número, y usted no obtendrá un error. Pero ese es el estilo de programación malo y simplemente pidiendo errores.

Aunque una array es simplemente una secuencia de todas las variables adyacentes entre sí en la memoria, la nombre de una matriz es en realidad un puntero al primer elemento de la matriz. Usted puede utilizar el nombre como un puntero. Sin embargo, hacerlo sólo cuando usted realmente necesita para trabajar con un puntero. Después de todo, usted realmente no tiene ninguna razón para escribir código que es críptico, como * (Números + 3) = 10.

Lo contrario también es cierto. Mira esta función:

anular ProcessArray (Números int *) {cout lt; lt; Números [1] lt; lt; endl-}

Esta función toma un puntero como un parámetro, sin embargo, usted acceder a ella como una matriz. Una vez más, no escribir código como esto: en su lugar, usted debe entender ¿por código como este funciona. De esa manera, obtener un conocimiento más profundo de los arreglos y la forma en que viven dentro de la computadora, y este conocimiento, a su vez, puede ayudarle a escribir código que funcione correctamente.

A pesar de que, el nombre de la matriz es un puntero, el nombre de una matriz de enteros no es exactamente lo mismo como un puntero a un entero. Echa un vistazo a estas líneas de código (que se encuentra en el Array03 ejemplo):

int LotsONumbers [50] -INT x-LotsONumbers = X-

Apunte el LotsONumberspuntero a algo diferente: algo declarada como un entero. El compilador no le permiten hacer esto: usted obtiene un error. Eso no sería el caso si LotsONumbers fueron declarados como int * LotsONumbers- a continuación, el código funcionaría. Pero tal como está escrita, este código le da un error del compilador. Y lo creas o no, aquí está el error del compilador que se obtiene en Code :: Blocks:

error: tipos incompatibles en la asignación de 'int *' para 'int [50]'

Este error implica el compilador no ver una clara distinción entre los dos tipos, int * y int []. Sin embargo, el nombre de la matriz es de hecho un puntero, y se puede utilizar como uno que no se puede hacer todo con ella que pueda con un puntero normal, como reasignarlo.

Al utilizar matrices, a continuación, tenga en cuenta los siguientes consejos. Estos le ayudarán a mantener sus matrices libre de errores:

  • Mantenga su código consistente. Si se declara, por ejemplo, un puntero a un entero, no lo tratan como una matriz.

  • Mantenga su código claro y comprensible. Si pasa punteros, está bien para tomar la dirección del primer elemento, como en (MyNumbers [0]) si esto hace que el código más claro - aunque es equivalente a poco MyNumbers.

  • Cuando se declara una matriz, siempre trato de poner un número dentro de los corchetes, a menos que usted está escribiendo una función que toma una matriz.

  • Cuando se utiliza el externo palabra clave para declarar una matriz, siga adelante y también puso el tamaño del arreglo soportes interiores. Pero ser coherentes! No utilice un número de una sola vez y un número diferente en otro momento. La forma más fácil de ser consistente es el uso de una constante, tal como const int arraysize = 10- en un archivo de cabecera común y luego usar eso en su declaración de matriz: int MiArray [arraysize] -.




» » » » Arrays y punteros en c ++