jump to navigation

Pointers (Apuntadores): un ejemplo. 21.4.12

Posted by Migsar in Computación.
Tags: , , , ,
trackback

Primero que nada, esto no es un tutorial ni intenta serlo, uno muy bueno (en inglés) se encuentra aquí:
A Tutorial on pointers and arrays in C

Yo varias veces he leído y aprendido a usar los apuntadores, pero como no programo tan seguido se me olvida y siempre tengo que volver a empezar, pongo este código como recordatorio y ejemplo rápido del uso de apuntadores para acceder a arreglos, esta vez lo estoy ocupando para cosas de OpenGL mientras aprendo, después pondré alguna cosilla por aquí.

Ayer descubrí codepad.org es un sitio en donde se pega código y genera un link para ponerlo en lugares donde no dejan escribirlo, no sé cuanto tiempo este disponible, pero el de este código es http://codepad.org/02pim6Wg, es bonito porque lo compila y pone el resultado hasta abajo; por otro lado también descubrí que Gmail apesta, porque no puedes subir muchas clases de archivos (como cpp) pero no te dice absolutamente nada, simplemente no lo carga, mi queja completa está en mi otro blog, ya que en este quiero contenido más útil, feliz. Me gustaría que la lean porque me parece que las filosofias individuales son las únicas capaces de cambiar el rumbo colectivo.

// Programa sobre pointers hacia un arreglo de arreglos y como pasarlos a funciones...
#include

using namespace std;

void pruebav1(const float *vertex)
{
cout << "Usando v1, apuntando a una dirección de punto flotante: \n";
for (int i=0; i<12; i++)
{
cout << "Dirección: " << vertex + i;
cout << " Valor: " << *(vertex+i) <<"\n";
}

cout << "\n";
}

void pruebav2(const float *vertex, const float arreglo[4][3])
{
cout << "Usando v2, apuntando a un arreglo: \n";
for (int i=0; i<4; i++)
{
vertex = arreglo[i];
for (int j=0; j<3; j++)
{
cout << "Dirección: " << vertex+j;
cout << " Valor: " << *(vertex+j) <<"\n";
}
}

cout << "\n";
}

void pruebav3(const float (*vertex)[3])
{
cout << "Usando v3, apuntando a un arreglo de arreglos: \n";
/* v3 es un arreglo de pointers o un pointer a arreglos (de pointers),
* si incrementamos v3 por uno, la dirección a la que apunta incrementa por tres,
* que es en este caso el tamaño de la segunda dimensión de nuestro arreglo. Por ejemplo:
*/

for (int i=0; i<4; i++)
{
cout << "Dirección["<< i <<"]: " << vertex+i;
cout << " Valor["<< i <<"]: " << *(vertex+i) <<"\n";
}

cout << "\n";

/* Como se puede ver, el valor del apuntador es otro apuntador,
* si queremos obtener el primer valor del arreglo es necesario usar un pointer doble:
*/

cout << "Valor de la dirección a la que apunta v3: " << *vertex <<"\n";
cout << "Valor del apuntador al que apunta v3: " << *(*vertex) <<"\n";

// Podemos incrementar ambos pointers:
cout << "Si v3 se incrementa por 1:\n";
cout << "Dirección: " << vertex+1;
cout << " Valor: " << *(vertex+1);
cout << " Valor del apuntador: " << *(*(vertex+1)) <<"\n";

cout << "\n";

cout << "Si el apuntador al que apunta v3 se incrementa en 1:\n";
cout << "Dirección: " << *vertex+1;
cout << " Valor: " << *(*vertex+1) <<"\n";
}

int main()
{
/* Esto fue lo que pensé inicialmente, está equivocado porque significa
* tres arreglos de cuatro elementos cada uno
*
* float vertices[3][4];
*
* vertices[0][0] = 0.0f ; vertices[1][0] = 1.0f ; vertices[2][0] = 2.0f ;
* vertices[0][1] = 3.0f ; vertices[1][1] = 4.0f ; vertices[2][1] = 5.0f ;
* vertices[0][2] = 6.0f ; vertices[1][2] = 7.0f ; vertices[2][2] = 8.0f ;
* vertices[0][3] = 9.0f ; vertices[1][3] = 10.0f ; vertices[2][3] = 11.0f ;
*/

// Y quería cuatro arreglos de tres elementos cada uno (simulando puntos tridimensionales)
float vertices[4][3];

vertices[0][0] = 0.0f ; vertices[0][1] = 1.0f ; vertices[0][2] = 2.0f ;
vertices[1][0] = 3.0f ; vertices[1][1] = 4.0f ; vertices[1][2] = 5.0f ;
vertices[2][0] = 6.0f ; vertices[2][1] = 7.0f ; vertices[2][2] = 8.0f ;
vertices[3][0] = 9.0f ; vertices[3][1] = 10.0f ; vertices[3][2] = 11.0f ;

float * v1;
float * v2;
float (*v3)[3];

v1 =&vertices[0][0];
v2 = NULL;
v3 = vertices;

/*
// Primero imprimimos la tabla dirección-valor usando v1

cout << "Usando v1, apuntando a una dirección de punto flotante: \n";
for (int i=0; i<12; i++)
{
cout << "Dirección: " << v1 + i;
cout << " Valor: " << *(v1+i) <<"\n";
}

cout << "\n";
*/

pruebav1(v1);

/*
cout << "Usando v2, apuntando a un arreglo: \n";
for (int i=0; i<4; i++)
{
v2 = vertices[i];
for (int j=0; j<3; j++)
{
cout << "Dirección: " << v2+j;
cout << " Valor: " << *(v2+j) <<"\n";
}
}

cout << "\n";
*/

pruebav2(v2,vertices);

/* Los comentarios los dejé en pruebav3 para no tener comentarios anidados

cout << "Usando v3, apuntando a un arreglo de arreglos: \n";

for (int i=0; i<4; i++)
{
cout << "Dirección["<< i <<"]: " << v3+i;
cout << " Valor["<< i <<"]: " << *(v3+i) <<"\n";
}

cout << "\n";

cout << "Valor de la dirección a la que apunta v3: " << *v3 <<"\n";
cout << "Valor del apuntador al que apunta v3: " << *(*v3) <<"\n";

cout << "Si v3 se incrementa por 1:\n";
cout << "Dirección: " << v3+1;
cout << " Valor: " << *(v3+1);
cout << " Valor del apuntador: " << *(*(v3+1)) <<"\n";

cout << "\n";

cout << "Si el apuntador al que apunta v3 se incrementa en 1:\n";
cout << "Dirección: " << *v3+1;
cout << " Valor: " << *(*v3+1) <<"\n";
*/

pruebav3(v3);

return 0;
}

P.d. Es necesario incluir iostream pero por alguna extraña razón se lo quita (ver lo que dice mi queja en el texto :p)

Anuncios

Comentarios»

No comments yet — be the first.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s

A %d blogueros les gusta esto: