[C con Clase] Dudas con punteros

Jorge Luis Betancourt González mayragm en finlay.cmw.sld.cu
Lun Dic 18 10:31:48 CET 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
 
Hola Jose:

Bueno, primero que todo señalarte que el concepto de puntero que das
no es correcto: has dicho

| dirección de memoria en
| la que se almacena el valor de una variable

cuando en realidad es una variable que contiene la dirección de
memoria de otra variable, o sea has intercambiado ambas porciones del
concepto, una vez aclarado esto veamos tu situación:

Mira, realmente los punteros son una herramienta más que se le da al
programador de C/C++ e incluso otros lenguajes como Pascal, para que
realice sus funciones básicamente los punteros te sirven para ahorrar
memoria (unos cuantos bytes) ya que para a la hora de ejecutar tu
programa no es lo mismo manipular la dirección de una variable que
tener que manipular la variable enteramente, dicho sea no es lo mismo
1 byte que 4 bytes, pero aparte de esto existen infinidad de situación
donde se utilizan punteros de forma casi obligatoria, veamos un ejemplo:

Se necesita una función que ordene un arreglo basándose en el
algoritmo de ordenamiento por selección, para tomar un ejemplo,
simplemente puede hacer tu función a la cual, lógicamente, le pasarás
el arreglo que deseas, ahora existe la disyuntiva de si pongo el
parámetro como puntero o normal si lo paso por valor, bueno dado que
un arreglo puede tener supongamos _bastantes_ elementos 1000 o 2000
por ejemplo puede ser mucho más eficiente pasar el punto a nuestra
función que tenerle que pasar todo el arreglo, es decir 1000 o 4000
enteros no es lo mismo que la dirección de memoria solamente, así por
poner un ejemplo nuestra implementación pudiera quedar:

void selectionsort(int *array, int size) {
  int i, j, lowindex;

  for (i = 0; i < size - 1; i++) {
    lowindex = i;
    for (j = size - 1; j > i; j--)
      if (array[j] < array[lowindex]) lowindex = j;
    swapi (&array[i], &array[lowindex]); // función que intercambia
dos elementos, otro ejemplo de punteros
  }
}

Esto sería abordando por ejemplo, temas sencillos, pero ten en cuenta
que también en la herencia y demás características de la programación
orientada a objetos propiamente es prácticamente indispensable el
puntero, al menos para mi.

Sobre la memoria dinámica ya viene siendo un tema un tanto más
complejo, uno de los ejemplo clásicos es por ejemplo cuando se quiere
diseñar un arreglo que no tenga un tamaño determinado, sino que a
medida que vayan siendo necesario más espacio el arreglo sea capaz de
«crecer» de una forma determinada, en estos casos es esencial la
utilización de punteros.

Ejemplos existen miles y de diferentes formas te pueden aparecer, lo
cierto es que no existe (a mi entender) una regla que te diga _aquí
tenés que utilizar punteros_ y aquí no tenés, es simplemente cuestión
de razonamiento de uno como programador.

Espero que te sirva,

slds

P.S: Aclarar que en el caso del ordenamiento es lógico que este no
sería el algoritmo más idóneo para ordenar esta cantidad de elementos,
pero el punto aquí no era el algoritmo sino más bien la utilización de
punteros, y además aclarar que también en C++ existen las referencias
que también se pueden utilizar pero al igual que en el caso anterior
no son objetivos de esa duda.

Jose Manuel F escribió:
> Hola a todos,
>
> Me gustaría saber si alguien de vosotros puede ponerme varios
> ejemplos en los que el uso de punteros sea necesario o
> recomendable. Desde que los estudié por primera vez tuve claro su
> significado (dirección de memoria en la que se almacena el valor de
> una variable) pero cuando llega la hora de picar el código nunca sé
> cuándo usarlos. Si alguien puede aclarame la duda me sería de mucha
> utilidad.
>
> Me encuentro en situación parecida en lo que respecta a la memoria
> dinámica.
>
> Gracias por todo.
>
> _________________________________________________________________
> ¿Estás pensando en cambiar de coche? Todas los modelos de serie y
> extras en MSN Motor. http://motor.msn.es/researchcentre/
>
>
> _______________________________________________ Cconclase mailing
> list Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>
>

- --
Jorge Luis Betancourt González
E-Mail: betancourt.jorge en gmail.com (home)
        mayragm en finlay.cmw.sld.cu (work/home)
G-Talk: betancourt.jorge en gmail.com (jabber)
Blog:   http://jorgelb.blogeasy.com
Phone:  ++(53)(32)59440
Linux User: 386271
[El conocimiento humano pertenece al mundo]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.4 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
 
iD8DBQFFhmAEsjoqrMJrWakRAjnyAKCGwnwY51Y14Vu+U0uwPdwe55Ld3QCgiX0f
jtNyKv0sFC/jkfwBxPI2e+o=
=9EqN
-----END PGP SIGNATURE-----


-- 
Este mensaje ha sido analizado por MailScanner del Nodo Finlay, Camaguey, Cuba
en busca de virus y se considera que está limpio.





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