[C con Clase] Punteros y arrays

Steven Davidson srd4121 en njit.edu
Jue Jul 7 02:53:36 CEST 2011


Hola Antonio,

2011/7/2 Antonio Cascales <antonio.cascales en gmail.com>

> **
> Hola a todos:
>
>    Me llamo Antonio, y soy relativamente nuevo por la lista. Llevo tiempo
> por aquí, con el fín de aprender a programar, pero pese a lo mucho que me
> gustaría entender todo lo que por aquí comentáis, soy incapaz de avanzar.
>
>    ya le he pegado varios repasos al curso de C++ que tenéis por la web,
> pero debo de ser bastante poco inteligente, porque no logro entender
> determinados conceptos.
>
>

No lo creo. A TODOS nos ha pasado, y especialmente el tema de los punteros,
que incluso algunos veteranos se equivocan con ellos y tienden a detenerse
más de la cuenta para estar seguros de lo que hacen.


>    Es por eso que os escribo, para ver si alguien, bien sea con una
> explicación más clara, o con ejemplos concretos, me pudiese ayudar a
> entender qué son los punteros y los arrays. Y casi más lo primero que lo
> segundo, porque al menos, los arrays de 1 vector creo entenderlos. La
> utilidad y el funcionamiento de más de dos índices, ya se me escapa.
>
>    ¿alguno podríais echarme una mano?
>
>

Bueno, muchos te han ayudado, pero voy a aportar de mi parte.

Como bien ha explicado Leonardo, un puntero es una variable que es capaz de
guardar la dirección de memoria como su valor. Ahora bien, eso de por sí, no
es muy práctico, por lo que nos interesa poder acceder a esa dirección de
memoria guardada para leer y/o escribir el valor guardado en ella. Como
C/C++ son lenguajes FUERTEMENTE tipificados, necesitamos indicar el tipo del
dato apuntado. Por lo tanto, podemos decir que un puntero tiene dos tipos de
datos: el suyo propio (el puntero) y el tipo del valor apuntado. Por
ejemplo,

int num = 10;
int *ptr = #

Para el tema de los punteros, siempre es bueno mirar lo que hay en memoria.
Para esto, usamos un "vector descriptor" que viene a ser una tabla de las
características importantes de las variables en un programa. Por ejemplo,
las definiciones anteriores serían así:

Dirección de Memoria       Tipo de dato     Nombre      Valor
------------------------------------------------------------------------------------------
0x22AACC00                    int                     num            10
...
0x33DDEE00                    int *                   ptr
0x22AACC00
...

Las direcciones de memoria están en hexadecimal. Lo interesante de lo
anterior es la asociación entre el valor del puntero, 'ptr', y la dirección
de memoria del entero, 'num', que ambos son: 0x22AACC00. Así es como el
puntero "apunta" a una variable: a través de su dirección de memoria.

En cuanto a arrays de varias dimensiones, personalmente es mejor tratar
estos casos como arrays de arrays de arrays de ... algún tipo de dato. Si lo
prefieres, puedes decir que se trata de un grupo de un grupo de un grupo de
... algo. Desde luego, no son "dimensiones", sino más bien diferentes
cantidades de grupos en cada grupo. Te pongo un ejemplo,

int lista[12][5][30];

Aquí, 'lista', es un array de 12 arrays de 5 arrays de 30 enteros. Si
prefieres, nos extendemos un poco con la explicación: 'lista', es un array
de 12 elementos, en que cada uno es un array de 5 elementos, en que cada uno
es un array de 30 elementos, en que cada uno es un entero de tipo 'int'.
Como dije antes, se trata de un grupo que contiene varios grupos, los cuales
se constituyen de varios grupos, donde cada uno de ellos se comprende de
varios grupos ... al final, habrá un grupo de un elemento básico.

Podemos organizarnos con el código fuente, y usar 'typedef' para que te sea
más fácil entender las cosas. Por ejemplo,

typedef int lista_estudiantes[30];
typedef lista_estudiantes lista_clases[5];

lista_clases asistencias[12];

Así podemos guardar las asistencias de 30 estudiantes de cada una de las 5
clases de los 12 cursos (o años) que hay en total en un colegio. Podríamos
continuar agregando más "dimensiones". Por ejemplo,

typedef lista_clases lista_cursos[12];

lista_cursos asistencias[10];

Ahora 'asistencias' representa las asistencias de 30 estudiantes por
cada clase de 5 por curso de 12 en 10 colegios de una ciudad. Agregando otra
dimensión, para representar la cantidad de ciudades, obtendríamos,

typedef lista_cursos lista_ciudades[10];
lista_ciudades asistencias[500];

Este array representa las asistencias por los 10 colegios por cada ciudad de
las 500 que existen. En fin, podemos seguir agrupando grupos de grupos, pero
creo que entiendes un poco más estos temas. Sin usar 'typedef' para
organizarnos, acabaríamos por definir el siguiente array:
int asistencias[500][10][12][5][30];

que sin saber qué significa cada "dimensión", terminaríamos con un dolor de
cabeza para descifrar esto.


Espero que esto te aclare un poco los temas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110707/6c4b49b5/attachment.html>


Más información sobre la lista de distribución Cconclase