[C con Clase] Dudas con punteros

Miguelwill (miguel tudela) miguelwill en gmail.com
Mie Dic 20 17:11:44 CET 2006


también es bueno recordarle a nuestro amigo que hizo la consulta sobre
punteros, que las cadenas de caracteres y de números están muy relacionadas
con los punteros, ya que en el caso de una cadena (números o caracteres)
cuando uno se refiere al contenido de dicha cadena, puede referir ce de la
forma de acceder a las variables, de la forma cadena[0], cadena[1],
cadena[2], etc.
esto también se puede hacer a través de un puntero, ya que el nombre de la
cadena funciona como un puntero al primer elemento, en el caso de las
funciones en que haya que entregar una cadena como parámetro, solo se
entrega el nombre de la cadena, sin los índices que hacen referencia a cada
uno de los elementos, y de esta forma, se entrega a la función la dirección
de memoria de dicha cadena, y de esa forma la función accede directamente a
los datos a través de la dirección que se le entrego, sin importar con esto
la longitud de dicha cadena.
poner &cadena[0] es igual que poner solo "cadena", ya que ambas formas
entregan la dirección de memoria del primer elemento.

daré algunos ejemplos:

main()
{
    char cadena1[20];
    char cadena2[20];// se declaran 2 cadenas de caracteres de 20 espacios
    char* puntero_a char1;
    char* puntero_a_char2; // se declaran 2 punteros a char (que es lo mismo
que se use a "cadena1")
    char CCC;   // se declara variable char de un solo caracter
    int i;


   CCC = *(puntero_a_char + 2);
     // CCC adquiere el valor que hubiera habido en la variable "cadena1[1]

   puntero_a_char1 = cadena1;
   puntero_a_char2 = cadena2;
   for(i=0; i<20; i++)  // ciclo que servira para copiar el contenido de
"cadena1" en "cadena2"
      {
        *(puntero_a_char1 + i ) = *(puntero_a_char2 + i);
         printf("%c", *(puntero_a_char + i));
      }

   printf("\n el contenido de la variable CCC es => %c",CCC);

}// end main

otro uso muy llamativo de los punteros es con la administración dinámica de
la memoria, pero eso se
a explicado antes y si tienes alguna duda con respecto a esto ultimo solo
tienes que preguntar.

saludos





El día 18/12/06, Jorge Luis Betancourt González <mayragm en finlay.cmw.sld.cu>
escribió:
>
> -----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.
>
>
> _______________________________________________
> Cconclase mailing list
> Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>



-- 
M.T.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20061220/15f235f6/attachment.html>


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