• Lunes 6 de Mayo de 2024, 14:53

Autor Tema:  Punteros en C  (Leído 1439 veces)

Javichuvm

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Punteros en C
« en: Jueves 21 de Agosto de 2008, 14:50 »
0
Hola a todos.

Tengo una duda sobre los punteros en C. Veamos, yo se lo que es una variable declarada así:

Código: Text
  1. int *x;
  2.  

X guarda una dirección de memoria(apunta a una dirección de memoria) donde reside el valor no?
Pero lo que ya me pierde bastante es en un ejercicio para hacer, en el cual me dan variables con la siguiente estructura:

Código: Text
  1. char ****car1
  2. char ***car2
  3.  

Alguien me puede explicar como funcionan estas dos estructuras??

gracias y un saludo!

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: Punteros en C
« Respuesta #1 en: Jueves 21 de Agosto de 2008, 17:05 »
0
nooo,  jajja, q es eso!?,  :lol:

Voy a ver si capaz te puedo dar una idea mostrandote una variable de doble puntero (minimicemos las cosas para q sea mas claras)

una variable doble puntero como x declarada asi:  int **x; generalmente se utiliza para hacer matrices, ya que una variable puntero es alocada con malloc y tenes un arreglo, entonces con una doble puntero, allocas un arreglo donde cada elemento del mismo es otro arreglo (ahi tenes los dos pointers).
Claro que no unicamente se utiliza para eso, la misma variable podria contener un arreglo donde cada posicion es un puntero a un solo entero, en fin, los punteros son una masa.

Para ver esas variables  que mostras vos, habria que ver como es el enunciado del ejercicio, capaz es un vector que dentro tiene otro vector q apunta a una matriz, no se.. abria q verlo.


espero que te haya sido util

saludos ;)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Punteros en C
« Respuesta #2 en: Viernes 22 de Agosto de 2008, 09:28 »
0
Cita de: "Rombus"
generalmente se utiliza para hacer matrices, ya que una variable puntero es alocada con malloc y tenes un arreglo, entonces con una doble puntero, allocas un arreglo donde cada elemento del mismo es otro arreglo (ahi tenes los dos pointers).
Claro que no unicamente se utiliza para eso, la misma variable podria contener un arreglo donde cada posicion es un puntero a un solo entero, en fin, los punteros son una masa.

Me parece que no explicas qué es un puntero ni un doble puntero, simplemente pones un caso de uso.

Un puntero es una variable que contiene una dirección de memoria. Tan simple como eso. En dicha dirección de memoria se encuentra un valor. Por ejemplo:

Código: Text
  1. int *p;
  2.  

"p" es una dirección de memoria (0x0800FAFA por ejemplo). Lo podéis comprobar haciendo:

Código: Text
  1. printf("%x",p);
  2.  

En dicha dirección de memoria reside un valor int. Si ahora definimos

Código: Text
  1. int **p;
  2.  

estamos definiendo un puntero a un puntero a un entero. Esto es, "p" es un puntero, por tanto una dirección de memoria. En esta dirección de memoria encontramos un valor (*p), que es otra dirección de memoria. En esta última dirección de memoria (*p) encontramos el valor int (**p). Y así sucesivamente con todos los "*" que quieras ponerle delante a un puntero.

p -> *p -> int (**p)

Espero que te haya aclarado algo.

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Punteros en C
« Respuesta #3 en: Viernes 22 de Agosto de 2008, 14:24 »
0
Como decia Rambus es algo muy utilizado para declarar vectores multidimensionales de forma dinamica (matrices de más de una dimensión).

m0skIt0 te esplica bien como funciona. Voy a intentar esplicarte para qué:

Imagina que quieres crear una matriz. Lo primero que se nos ocurre normalmente es declarar algo del tipo:

Código: Text
  1.  
  2. int array[125];
  3.  
  4.  

Pero tendriamos que especificar el tamaño de la matriz o vector. En este caso 125;
Cuando esto no esta claro (el vector no sabemos cunto va a ocupar), utilizamos vectores dinamicos que no son más que un puntero que nos indicaria el comienzo (la dirección inicial) de los datos.

Sumando y restando a ese puntero nos podemos mover a través de los distintos elementos. Por supuesto, hay que utilizar funciones para la gestion de memoria para inicializar y cambiar el tamaño de la memoria reservada a dicho array (por ejemplo malloc).

Cuando queremos utilizar una matriz bidimensional del tipo

Código: Text
  1.  
  2. int array[125][125];
  3.  
  4.  

podemos considerarlo como un vector de vectores. Es decir un vector cullo tipo de dato es un vector siempre del mismo tamaño.
Así aparece el concepto de filas y columnas. En este tipo de array, cada fila es un array de una única dimensión y la columna indica el elemento dentro de ese array unidimensional.

La matriz anterior define 125 vectores de 125 elementos cada uno.

Si las filas no tienen todas el mismo número de elementos nos encontramos con el mismo problema de antes y podemos recurrir también a los vectores dinámicos. Asi es como surgen los punteros a puntero. Tenemos que inicializar un puntero (un vector dinámico) que indique el comienzo de una zona de memoria donde haya otros punteros (otros vectores dinámicos). La declaración sería así.
Código: Text
  1.  
  2. int **array;
  3.  
  4.  

Para inicializar este puntero necesitarías enlazar llamadas a funciones de inicialización de memoria;

Si quisieramos, añadir otra dimensión, tendriamos que crear un vector que apunte a otra seríe de vectores que a su vez apunten a otros vectores que apuntan a los datos en cuestión. Sería:
Código: Text
  1.  
  2. int ***array;
  3.  
  4.  

y así hasta el infinito.

El uso de arrays dinamicos es más dificil pero mucho más versatil y rápido que el uso de arrays estáticos. Por eso se suele utilizar para la creacción de estructuras complejas como pilas, bufferes circulares, etc.. o en el uso de técnicas de transacción rápida de memoria como el doble buffering.

Para entender realmente esto (para mi una de las cosas más bonitas del C/C++ busca referencias sobre la creacción y uso de vectores dinámicos y sobre la inicialización de estos con funciones como malloc;

Un saludo y espero no haber aburrido a nadie  ^_^