Anda di halaman 1dari 4

ARRAYS Y PUNTEROS EN C

Qu es un Arrays? Un array es una coleccion ordenada de objetos, llamados elementos del array, todos del mismo tipo. Un array de 10 elementos se declara de la siguiente forma: float a[100]; El primer elemento de este array es a[0], y el ultimo a[9]. Un array se puede inicializar asi: float a[3] = {10.1,10.2,10.3}; Si no se indica el tamao del array, este ser igual al nmero de elementos que se indiquen: float x[] = {1.3, 2.4}; Arrays multidimensionales. Los arrays multidimensionales se declaran: int a[3][3], b[2][3]; En este ejemplo, a es una matriz 3x3, y b una matriz 2x3. Los elementos se almacenan por filas, al contrario de lo que sucedia en FORTRAN. Asi, podemos inicializar b de la siguiente forma: int b[2][3] = { {1,2,3}, {4,5,6} }; Punteros. El concepto de puntero est unido a la forma en que los tipos de datos son almacenados en la memoria de un ordenador, ya que denotan la direccin de una variable determinada. El nombre de la variable determina el tipo (char, int, float o double) y su direccin determina donde esta almacenada. Conocer la direccin de una variable es importante porque: Permite que las funciones cambien el valor de sus argumentos, como veremos en el captulo siguiente. Permite pasar vectores de forma eficiente entre funciones: en lugar de copiar cada elemento del vector, se copia la direccin del primer elemento. Permite reservar memoria en tiempo de ejecucin en lugar de en tiempo de compilacin, lo que significa que el tamao de un vector puede ser determinado por el usuario en lugar de por el programador. El nombre de un array es un puntero al array. Por tanto, los punteros y los arrays estn ntimamente ligados en C y en C++.

Terminologa bsica. Para entender los punteros y los vectores, es necesario conocer primero como se almacenan los nmeros en la memoria del ordenador. El valor de cada variable en un programa de ordenador se guarda en una seccin de memoria cuyo tamao est determinado por el tipo de dato de la variable. La localizacin de esta seccin de memoria es almacenada en la direccin de la variable. Por tanto, es como si cada variable estuviera compuesta de dos partes: su valor y su direccin. Cada celda de memoria se puede considerar compuesta de una parte con el contenido, y otra en la que se almacena la direccin. Esto es anlogo a una fila de casas: cada casa tiene diferentes contenidos, y para mirarla necesitamos conocer su direccin. Las direcciones se representan normalmente por un nmero hexadecimal, pudiendo contener un carcter, un entero o un real (aunque en realidad todos son almacenados como nmeros binarios). Para obtener la direccin de una variable se utiliza el operador direccin &: #include <iostream.h> main() { double d = 2.7183; cout << 'numero = ' << d << '\tdireccion = ' << &d << '\n'; } El valor de d es 2.7183. El valor de &d es una direccin (donde 2.7183 est almacenado). La direccin es imprimida en formato hexadecimal. Direcciones y punteros Un puntero guarda la direccin de un objeto en memoria, y como tal un puntero es tambin una variable. Puede parecer algo confuso, es como decir que el contenido de una casa es la direccin de otra vivienda. Las direcciones se guardan como nmeros hexadecimales, por lo que no hay ninguna razn por la que no podamos definir otro tipo de dato, similar a un entero, pero a travs del cual se puede modificar el valor almacenado en esa direccin. Es importante entender la relacin entre punteros y direcciones: Cada variable tiene su direccin, que puede ser obtenida mediante el operador unario &. La direccin de una variable puede ser almacenada en un tipo de dato llamado puntero. Un puntero en C o en C++ se declara anteponiendo un * al nombre de la variable, que es el operador inverso a &. El puntero apunta entonces a una variable del tipo especificado, y no debe ser usado con variables de otros tipos. Un experto en C podra forzar la utilizacin de un puntero con un tipo distinto del que se ha declarado, pero no es recomendable, ya que podra conducir a un uso errneo. Ejemplos de declaracin de punteros: int *puntero1;

int *puntero2, *puntero3; char variable, *punteroCaracter; float *punteroReal, real; En la primera lnea, declaramos un puntero a un entero. En la segunda, dos punteros a entero. En la tercera, un carcter (variable) y un puntero a carcter (puntero Carcter). Por ltimo, puntero Real es un puntero a un real, y real es declarado como un nmero real. Ejemplo de uso del operador * y del operador de direccin (&): #include <iostream.h> main() { double d, *dp; d = 2.7183; dp = &d; cout << 'numero = ' << d << '\tdireccion = ' << &d << '\n'; } Operaciones con punteros. Un puntero es un tipo de dato similar a un entero, y hay un conjunto de operaciones definidas para punteros: La suma o resta de un entero produce una nueva localizacin de memoria. Se pueden comparar punteros, utilizando expresiones lgicas, para ver si estn apuntando o no a la misma direccin de memoria. La resta de dos punteros da como resultado el nmero de variables entre las dos direcciones. Siempre que se realiza una operacin aritmtica sobre un puntero, sumando o restando un entero, el puntero se incrementa o decremento un numero apropiado de sitios tal que el nuevo valor apunta a la variable que esta n elementos (no n bytes) antes o despus que el dado. De la misma forma, al restar dos punteros se obtiene el nmero de objetos entre las dos localizaciones. Finalmente, dos punteros son iguales si y solo si apuntan a la misma variable (el valor de las direcciones es el mismo). No son necesariamente iguales si sus valores indirectos son los mismos, ya que estas variables podran estar en diferentes localizaciones de memoria. La siguiente tabla resume los operadores que manipulan punteros:

Anda mungkin juga menyukai