Imaginemos un mundo libre

La paz interior comienza en el momento en el que decides no permitir, que ninguna persona o evento, tome el control de tus emociones.

Vectores, Matrices y Punteros en c++

with 62 comments

Estimados lectores y fans, les pido disculpas por este humilde y sencillo post, se que este tutorial es una humillación a su inteligencia y profesionalismo, pero comprendan que esto va dedicado a personas que como yo recién empiezan con sus primeros pininos en C++. Espero de verdad le sea útil a alguien.

Escribir todo esto, me costó una noche entera y mucho café. Parte de los conceptos aquí los aprendí en clases de la U y mucho también lo aprendí por cuenta propia. Así que agradecimientos al teacher Patricio del cual aprendí muchísimo. Una vez más a ustedes y a los tantos miles de seguidores que me leen a diario las disculpas del caso.

Vamos ir avanzando de a pocos así que no se preocupen y desesperen porfavor, paciencia. La idea es que esta sección crezca con su ayuda, feedback y motivación. Luego vamos a ver ejemplos con objetos, clases, sobrecarga de operadores, métodos de búsqueda, màs ordenación, punteros, listas, pilas, colas, templates… por ahora sigo practicando y haciendo simples cosas con este lenguaje.

VECTORES

Un vector, también llamado array(arreglo) unidimensional, es una estructura de datos que permite agrupar elementos del mismo tipo y almacenarlos en un solo bloque de memoria juntos, uno despues de otro. A este grupo de elementos se les identifica por un mismo nombre y la posición en la que se encuentran. La primera posición del array es la posición 0.

Podríamos agrupar en un array una serie de elementos de tipo enteros, flotantes, caracteres, objetos, etc.

Crear un vector en C++ es sencillo, seguimos la siguiente sintaxix: Tipo nombre[tamanyo];

Ejm:

int a[5]; // Vector de 5 enteros
float b[5]; // vector de 5 flotantes
Producto product[5]; // vector de 5 objetos de tipo Producto

Podríamos también inicializar el vector en la declaración:

int a[] = {5, 15, 20, 25, 30};
float b[] = {10.5, 20.5, 30.5, 12.5, 50.5}
Producto product[] = {celular, calculadora, camara, ipod, usb}

Como hay 5 elementos en cada array, automáticamente se le asignará 5 espacios de memoria a cada vector, pero si trato de crear el vector de la forma int a[] , el compilador mostrará un error, porque no indiqué el tamaño del vector ni tampoco inicializé sus elementos.

Asigno valores a los elementos de un vector indicando su posición:

int a[4] = 30; // le asigno el valor 30 a la posición 4 del vector.
product[2].setPrecio(300) // le asigno un precio de 300 al producto en la posición 2.

Obviamente el método setPrecio() debe de estar implementado. Para llenar, recorrer e imprimir un vector podemos utilizar un bucle for:

#include <iostream>
using namespace std;

int main()
{
  int dim;
  cout << "Ingresa la dimension del vector" << endl;
  cin >> dim; // Supongamos que ingrese 10
  int vector[dim]; // mi vector es de tamanyo 10

  for(int i = 0; i < dim; i++){
    vector[i] = i * 10;
    cout << vector[i] << endl;
  }

  return 0;
}

La salida del programa mostrará: 0 10 20 30 40 50 60 70 80 90 Fàcil verdad? Bien ahora creen 2 o más vectores y empiecen a hacer funciones básicas como sumar, restar, buscar, ordenar, moda, etc que ayudan mucho a ir desarrollando la lógica. No vale copiar y pegar, mejor es practicar, practicar y practicar.

Aquí una función simple para sumar 2 vectores a y b y poner el resultado en un tercer vector c:

#include <iostream>
using namespace std;

void sumar(int a[], int b[], int c[],int dim) {
    for (int i = 0; i < dim; i++) {
        c[i] = a[i] + b[i];
    }
}

void imprimir(int v[], int dim)
{
   for(int i = 0; i < dim; i++) {
        cout << v[i] << endl;
   }
   cout << endl << endl;
}

int main()
{
    int dim;
    cout << "Ingresa la dimensión" << endl;
    cin >> dim;

    int a[dim];
    int b[dim];
    int c[dim];

    for(int i = 0; i < dim; i++) {
        a[i] = i * 10;
        b[i] = i * 5;
    }

    cout << "Vector A " << endl;
    imprimir(a, dim);

    cout << "Vector B " << endl;
    imprimir(b, dim);

    sumar(a, b, c, dim);
    cout << "Vector C " << endl;

    imprimir(c, dim);
    return 0;
}

Si ingreso una dimensión de 10, este programa me daría:

Vector A

0 10 20 30 40 50 60 70 80 90

VECTOR B

0 5 10 15 20 25 30 35 40 45

VECTOR C

0 15 30 45 60 75 90 105 120 135

Entonces para tomar en cuenta:

  • Todo vector debe tener definido un tipo de dato.
  • Todo vector necesita de una dimensión o tamanyo.

El código de arriba se puede mejorar muchísimo con objetos y clases, este es solo un pequeño ejemplo.

MATRICES

Una matriz es un vector de vectores o un también llamado array bidimensional. La manera de declarar una matriz es C++ es similar a un vector:

int matrix[rows][cols];

int es el tipo de dato, matrix es el nombre del todo el conjunto de datos y debo de especificar el numero de filas y columnas.

Las matrices también pueden ser de distintos tipos de datos como char, float, double, etc. Las matrices en C++ se almacenan al igual que los vectores en posiciones consecutivas de memoria.

Usualmente uno se hace la idea que una matriz es como un tablero, pero internamente el manejo es como su definición lo indica, un vector de vectores, es decir, los vectores están uno detrás del otro juntos.

La forma de acceder a los elementos de la matriz es utilizando su nombre e indicando los 2 subíndices que van en los corchetes.

Si coloco int matriz[2][3] = 10; estoy asignando al cuarto elemento de la tercera fila el valor 10.

No olvidar que tanto filas como columnas se enumeran a partir de 0. Bueno y para recorrer una matriz podemos usar igualmente un bucle. En este caso usando 2 for:

for(int i = 0; i < rows; i++) {
  for(int j = 0; j < cols; j++) {
    matrix[i][j] = i % j;
  }
}

PUNTEROS

El valor de todas las variales que manejamos en nuestros programas se almacenan en memoria y tienen una dirección. Un puntero es una variable especial que apunta a la dirección de memoria de una variable.

El puntero tiene a su vez su propia dirección. Todas estas direcciones tienen un formato hexadecimal.

Los punteros son herramientas muy poderosas con muchas utilidades y enormes ventajas como veremos más adelante. A grandes rasgos, un puntero me permite desplazarme en la memoria, apuntar, redireccionar a ciertas variables, funciones, métodos, objetos, etc sin necesidad de mover grandes bloques de datos, lo cual nos ahorra muchísimo el consumo de memoria en los programas.

Un puntero se debe declarar de acuerdo al tipo de dato al que apunta. Ejem:

int *var; // un puntero que puede apuntar a cualquier variable de tipo entero.
char *u;  // puntero de tipo char
Persona *per; // puntero de tipo persona

Para determinar,asignar la dirección de una variable en c++, se usa el operador & y para obtener el contenido de un puntero utilizamos el operador * Ejem:

int a; // entero
int *b; // puntero a entero
a = 20; // a tiene 20
b = &a; // asigno la dirección de a al puntero b

cout << b << endl; // imprime la dirección de memoria de a;
cout << *b; // imprime 20, osea el contenido de a

Ahora analicemos las siguientes instrucciones y veamos como las variables van cambiando de valor en tiempo de ejecución:

#include <iostream>

using namespace std;

int main()
{
    int a;
    int b;

    cout << "Ingresa el valor de a: ";
    cin >> a;
    cout << endl;

    cout << "Ingresa el valor de b: ";
    cin >> b;
    cout << endl;

    // Punteros de tipo entero
    int *p;
    int *p2;

    cout << "Antes" << endl;
    cout << "Variable a = " << a << endl;

    cout << "Direccion de a = " << &a << endl << endl;

    cout << "Variable b = " << b << endl;
    cout << "Direccion de b = " << &b << endl << endl;

    // Tiene basura al principio, podria inicializar con *p=0
    cout << "Contenido de p (Basura)= " << *p << endl;
    cout << "Direccion de p = " << &p << endl << endl;

    cout << "Despues" << endl;
    a++;
    p= &a;

    cout << "Contenido de p =  " << *p << endl;
    // p ahora tiene la dirección de b
    p = &b;
    // Le sumo 20 al contenido de p, es decir, estoy incrementando el valor de b
    *p +=20;

    cout << "Variable a = " << a << endl;
    cout << "Variable b = " << b << endl << endl;

    // p ahora tiene la dirección de a
    p=&a;

    // Contenido de p es igual al contenido de a * 5
    *p = a * 5;

    cout << "Contenido de p = " << *p << endl;
    cout << "Variable a = " << a << endl << endl;

    // Tiene basura al principio, podria inicializar con *p2=0
    cout << "Contenido de p2 (Basura) = " << *p2 << endl;
    cout << "Direccion de p2 = " << &p2 << endl << endl;

    // El contenido de p es asignado al contenido de p2
    p2 = p;

    // Incremento 15 al contenido de p2
    *p2 += 15;

    cout << "Contenido de p2 = " << *p2 << endl;
    // p apunta a otra dirección de memoria,se desplaza 4 bytes en memoria
    p++;

    // El contenido de esa nueva dirección
    cout << "Contenido de p (Basura) = " << *p << endl;

    return 0;
}

La salida del programa:

ANTES

Variable a = 10

Direccion de a = 0x22ff74

Variable b = 2

Direccion de b = 0x22ff70

Contenido de p (BASURA) = -1017291943

Direccion de p = 0x22ff6c

DESPUES

Contenido de p = 11

Variable a = 11

Variable b = 40

Contenido de p = 55

Variable a = 55

Contenido de p2 (BASURA) = 2293680

Direccion de p2 = 0x22ff68

Contenido de p2 = 70

Contenido de p (BASURA) = 2293680

El contenido de p y p2 al principio es basura porque no tienen ningun valor asignado aun.

Podriamos asignar el valor NULL a un puntero para luego posteriormente en algun problema que se me presente saber el estado del puntero y saber si contiene algo o no, así:

int *p = NULL;

ARITMÉTICA DE PUNTEROS

En las últimas sentencias del programa anterior: p++; cout << *p  pueden visualizar que estoy incrementando el puntero p en 1. Esto quiere decir que el puntero se desplazara 4 bytes en memoria (en este caso por ser entero) y entonces apuntará a otra dirección.

Por eso es que el nuevo contenido de p es basura o bueno el contenido de lo que tiene esa nueva dirección a la que apunta. Supongamos que definimos un entero y puntero de tipo char:

char c;
char *d;

d= &c; // asigno la direccion de c a d
c = 'u'; // asigno el valor u a mi variable c
c--; // desplazo una posicion a c
cout << *d;

No Imprimira ‘u’ porque fijense que desplazé c en sentido negativo 1 byte (los char ocupan a 1 byte). Es decir, que si d estaba apuntado a una dirección como por ejemplo 0x22ff99, despues del c– estará apuntando a algo como 0x22ff98

Para tomar en cuenta,  cosas que no puedo hacer con punteros:

int a = 15;
int *p;

double *q;
void *r;

// No puedo hacer lo siguiente:
p = a; // estoy asignando una variable a un puntero y un puntero es una dirección.
p = &50; // 50 es un valor constante y no una variable, por lo tanto no tiene dirección.
p = &(a+1); // una expresión no tiene dirección.
p = 30; // igual que el primer error, 30 es un entero.
&a = p; // no puedo cambiar la dirección de una variable.
p = q; // p es puntero de tipo entero y q de tipo double.

Un puntero de tipo void, es un puntero al cual le podemos asignar cualquier tipo de puntero. Por lo tanto si podriamos hacer esto: r = p;

VECTORES Y PUNTEROS

Cuando declaramos un vector int v[10] el nombre del vector, o sea v, es un puntero al primer elemento del vector, es decir a v[0].

Entonces como un vector es un puntero al primer elemento del mismo, también podríamos hacer aritmética de punteros con el vector.

(v + 1) ; // apunta a v[1];
*(v + 5); // me refiero al contenido de v[5]

// Y también puede colocar índices a los punteros:

int *p; // puntero de tipo entero
p = &v[0]; // p apunta a la dirección del vector v[0] o también a v. p = v
p[8] = 80; // le asigno el valor 80 al puntero en la posicion 8, es decir a v[8]

VECTORES DINÁMICOS

Lo que vimos en el inicio de este post, son vectores estáticos, puesto que tienen una cantidad fija de memoria asignada y tamaño definido que no podemos modificarlo. Sin embargo, un vector podría tener una cantidad variable de datos, a este se le llama un vector dinámico.

Para usar vectores dinámicos necesitamos gestionar memoria dinámica. Si bien es cierto que es trae enormes ventajas, el hacer un mal uso de la memoria dinámica nos podría traer problemas desastrozos.

Por eso es importante que que cuando creemos vectores dinámicos también liberemos la memoria utilizada. Obviamente eliminaremos la memoria utilizada cuando ya no necesitamos más usar, en este caso, un determinadao vector.

El operador new sirve para reservar memoria dinámica. El operador delete se usa para liberar la memoria dinámica reservada con new.

Para liberar memoria de un array dinámico usamos delete[] El espacio de memoria que hemos reservado con new tendrá vida hasta que finalize la ejecución del programa o cuando liberemos ese espacio con delete.

Siempre es recomendable liberar memoria para posteriormente no tener problemas con excesivo consumo de memoria. Un simple ejemplo:

#include <iostream>
using namespace std;

int main()
{
    int *pv;
    int dim;

    cout << "Ingresa el tamanyo del vector" << endl;
    cin >> dim;
    pv = new int[dim];

    for(int i = 0; i < dim; i++){
        pv[i] = i * i;
        cout << pv[i] << endl;
    }

    delete[] pv;
    return 0;
}

MATRICES Y PUNTEROS

Supongamos que declaro una matriz int m[5][5] Como dijimos anteriormente, el nombre o identificador de un vector es un puntero al primer elemento del vector.

En el caso de matrices el nombre de la matriz, en este ejemplo v, es un puntero que apunta al primer elemento del primer vector de la matriz.

Entonces m es un doble puntero.m es igual a &m[0] que es igual a la direccion de &m[0][0].

Si declaramos un puntero int *pm y luego igualamos pm = m, p ahora puede desplazarse por los valores de m. *p;  // contenido de m[0], el cual apunta al primer elemento de ese vector, es decir, m[0][0]

También puedo referirme a los contenidos con aritmética de punteros:

/* desplazo una posición a p, se refiere al contenido de m[1],
el cual apunta al primer elemento de ese vector, es decir, m[1][0] */
*(p + 1);

/* desplazo una posición en el vector principal y este a su vez se desplaza una posición en ese vector,
es decir, me refiero al contenido de m[1][1];*/
*(*(p + 1) + 1);

p[2][4] = 20; // asigno el valor 20 a la posición 2,4 de la matriz
*(*(p + 2) + 4) = 20 // es lo mismo que la asignación anterior
*(pm[2] + 4) = 20 // también lo mismo

// En conclusión:
p[i][j] = *(*(p + i) + j) = *(pm[i] + j)

MATRICES DINÁMICAS

Para crear una matriz dinámica debemos de crear un doble puntero int **pm y samos al igual que los vectores el operador new para reservar memoria y delete para liberar. Primero tenemos que crear el vector que contendrá a otros vectores especificando el numero de vectores que tendra este vector principal. Ejem:

pm = new int* [rows]; // creo el vector de punteros principal
for(int i = 0; i < rows; i++) {
  pm[i] = new int[cols]; // para crear los vectores dentro del vector principal
}

Ahora sí veamos un simple programa que crea una matriz dinámica, asigna valores, muestra el contenido de cada uno de los elementos los elementos así como sus direcciones de memoria.

También mostramos la matriz usando aritmética de punteros:

#include <iostream>
using namespace std;

int main()
{
    // Puntero a una matriz
    int **pm;

    int cols;
    int rows;

    cout << "Ingresa nro de filas: ";
    cin >> rows;

    cout << endl;
    cout << "Ingresa nro de columnas: ";
    cin >> cols;

    pm = new int* [rows];
    for (int i = 0; i < rows; i++) {
        pm[i] = new int[cols];
    }

    cout << "Elementos de la Matriz con sus direcciones: " << endl;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            pm[i][j] = i + j;
            cout << pm[i][j] << "--> ";
            cout << &pm[i][j] << endl;
        }
        cout << endl;
    }
    cout << endl;

    cout << "Elementos de la Matriz con sus direcciones, con aritmética de punteros: " << endl;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            // Aritmética de punteros
            *(*(pm + i) + j) = i + j;
            cout << *(*(pm + i) + j) << "--> ";
            cout << &pm[i][j] << endl;
        }
        cout << endl;
    }

    // Elimino cada vector de la matriz
    for (int i = 0; i < rows; i++) {
        delete[] pm[i];
    }

    // Elimino el vector principal
    delete[] pm;

    return 0;<!--EndFragment-->
}

La salida del programa: Ingresa el nro de filas: 6 Ingresa el nro de columnas: 4

//Elementos de la Matriz con sus direcciones
0–> 0×3d2c90 1–> 0×3d2c94 2–> 0×3d2c98 3–> 0×3d2c9c
1–> 0×3d2ca8 2–> 0×3d2cac 3–> 0×3d2cb0 4–> 0×3d2cb4
2–> 0×3d2cc0 3–> 0×3d2cc4 4–> 0×3d2cc8 5–> 0×3d2ccc
3–> 0×3d3ab8 4–> 0×3d3abc 5–> 0×3d3ac0 6–> 0×3d3ac4
4–> 0×3d3ad0 5–> 0×3d3ad4 6–> 0×3d3ad8 7–> 0×3d3adc
5–> 0×3d3ae8 6–> 0×3d3aec 7–> 0×3d3af0 8–> 0×3d3af4

//La matriz con aritmética de punteros
0–> 0×3d2c90 1–> 0×3d2c94 2–> 0×3d2c98 3–> 0×3d2c9c
1–> 0×3d2ca8 2–> 0×3d2cac 3–> 0×3d2cb0 4–> 0×3d2cb4
2–> 0×3d2cc0 3–> 0×3d2cc4 4–> 0×3d2cc8 5–> 0×3d2ccc
3–> 0×3d3ab8 4–> 0×3d3abc 5–> 0×3d3ac0 6–> 0×3d3ac4
4–> 0×3d3ad0 5–> 0×3d3ad4 6–> 0×3d3ad8 7–> 0×3d3adc

En mi caso esa son las direcciones de memoria.

El código fuente de este y otros ejercicios de C++ está disponible en Github: https://github.com/ronnyml/C—Tutorial

Gracias por tu visita al Blog. Puedes seguirme en Twitter haciendo click en el siguiente enlace:

Written by Ronny Yabar

July 4, 2009 at 5:32 pm

62 Responses

Subscribe to comments with RSS.

  1. ay no mames……. pues se ve que no tienes nada que hacer pero gracias me haz salvado en mi clase de c++ por que soy bien huevon

    carmen cadenita

    July 11, 2009 at 2:10 am

  2. Muy buen aporte, yo estoy empezando en la programacion y este tutorial, me ha servido mucho. Gracias. Sigue adelante con tus proyectos, son de bendicion.

    Eymard

    July 21, 2009 at 6:15 pm

  3. estuvo interesante gracias por la ayuda

    batusai

    August 2, 2009 at 8:24 pm

  4. Excelente trabajo. Muchas gracias por compartirlo.

    Santiago

    August 13, 2009 at 1:57 am

  5. excelente programacion

    sergio

    September 2, 2009 at 2:24 pm

  6. les agradesco su aporte

    JAVIER

    September 2, 2009 at 2:25 pm

  7. ps muchas gracias por dedicarte a esto, la verdad a mi me es de mucha utilidad, solbre todo x q es una materia muy complicada.
    m esta costando demasiado trabajo entender y no c como hacer para lograr comprender estos temas tan importantes.
    el semestre pasado reprobe esta materia sin comprender absolutamente nada. y este semestre m esta pasando lo mismo.
    tengo miedo!!

    lupe

    September 4, 2009 at 12:45 am

  8. Muchas gracias por tus aportes, realmente tenia ciertos conocimientos a cerca de matrices, pero en lo que tenia dudas es en los punteros. Ya que los punteros son elementos muy importantes para pra emplearlos en lenguaje c++

    juanm

    September 8, 2009 at 12:24 am

  9. Hola, ante todo felicitarte por compartir tus conocimientos….espero puedas ayudarme, hice un simple programa donde el usuario ingresa códigos del producto con sus respectivos precios y stock, cada uno en diferentes vectores, para que después el usuario nuevamente ingrese el código y el programa brinde la información de precio y stock que ingreso anteriormente, el programa ya lo hice pero lo que no puedo hacer es poder almacenar los códigos pero que contengan caracteres no solo números, para que me entiendas mejor tengo este tipo de códigos, cod{1243,2343,5535,5465,…}pero lo que deseo es que los códigos sean de este tipo cod{x001,l463,j664,….} gracias de antemano por la respuesta, espero no incomodar con mi pregunta.

    Oliver

    September 12, 2009 at 5:46 am

  10. Yo tambien buscaba un tutorial que no sea tan teorico sino practico aprendo mucho gracias por compartirlo.

    KAREN

    September 13, 2009 at 11:33 pm

  11. anduve navegando por internet buscando información de estos y finalmente encontre este espacio que aclaró mis dudas

    maria

    October 2, 2009 at 4:05 pm

  12. Felicitaciones por tus aportes, no me funciono el delete para borrar un elemento de una matriz, podrias colaborarme con esto. Gracias

    edna

    October 26, 2009 at 10:33 pm

  13. Este codigo no funciona en code::blocks
    es mas:
    for(int i=0;i<dim;i++)

    La estructura del bucle for es:
    for(initialización; condicional; paso) sentencia

    asi que no entiendo, ni mi compilador tampooco este “&lt”.

    :(

    LoLo

    October 28, 2009 at 9:03 pm

    • @LoLo si funciona lo que pasa es que cuando copie el código del editor , el wordpress transformó el símbolo < en &lt, pero ya está corregido y muchas gracias por el apunte. Lo probé en code::blocks y también funciona.

      Ronny Yabar Aizcorbe

      October 29, 2009 at 12:17 am

  14. wooo, lo q no aprendí en clases (x jugar solitario jeje) lo aprendí aquí, me salvast la vida, y a unos compañeros q tuvieron examen y les ayudé. grax

    Gilda

    December 8, 2009 at 5:01 pm

  15. Hola Ronny, gracias por tu tutorial en espanol.

    Estoy buscando un IDE o entorno para c++, que
    pueda marcar mis errores de sintaxis en rojo mientras digito,
    me pregunto si g++, el compilador de GNU lo puede hacer?

    gracias por tu buena voluntad

    Alexandra

    January 16, 2010 at 2:43 pm

    • Alexandra, si piensas usar un IDE para C++, podrías usar Code::Blocks que tiene las características que deseas y muchas más. Además es multiplataforma.

      Ronny Yabar Aizcorbe

      January 17, 2010 at 5:09 pm

  16. Gracias por la informacion, me sirvio mucho…

    jorge

    March 11, 2010 at 8:50 pm

  17. worale sta perfect……. ntendi muy bn waw

    adry

    March 25, 2010 at 2:15 am

  18. hola, me parecio una explicacion muy completa.
    es posible crear un clase contenedora de objetos, por ejemplo creo una clase persona y aparte creo una clase listapersona la cual almacenara los objetos de la clase persona, es eso posible.

    ya que con punteros se ve algo complicado.

    alguna referencia??

    yoh

    April 18, 2010 at 5:29 am

  19. super la informacion… hay q practicar mucho…

    nexus

    May 11, 2010 at 11:50 pm

  20. Hola

    Muy buen tuto y super bien eexplicado.

    Es muy facil comprender estos temas debido a la simplicidad y claridad en la explicacion de tus temas.
    Felicidades

    Deli

    July 16, 2010 at 4:12 am

  21. Sabes , estoy en la preparatoria y es muy dificil sabes como hacer un vector me quedan todabia 1 años si podrias mostrar algo basico !

    mario

    September 28, 2010 at 6:29 am

  22. Excelente aporte.

    CARRARO

    December 18, 2010 at 2:14 pm

  23. gracia por su trabajo a sido de mucha ayuda…

    geny

    April 12, 2011 at 2:41 pm

  24. me ayudo mucho sere el mas poderoso de los programadores xD

    dydier

    June 20, 2011 at 8:02 pm

  25. UF excelente … gracias por la supe explicación ahora si estoy lista para el quiz por que entendí mas aquí que en clase GRACIAS !! c=

    Yessenia (@PhoebeXenia)

    September 13, 2011 at 2:04 am

  26. !Felicidades!! y muchas gracias por este conocimiento compartido. solo un favor más recomiendame
    una bibliografia basica para aprender desde cero.de lenguaje c y c++

    francisco Ramos M.

    November 23, 2011 at 12:25 pm

  27. Muy buen aporte me sirvio mucho para la U. Saludos desde argentina

    theco

    November 27, 2011 at 8:42 am

  28. wow¡¡¡ gracias por subir esta información tan clara y fácil por que en otras paginas no le entiendo nada

    Carolina Martinez

    June 28, 2012 at 7:44 pm

    • me parece de gran ayuda !! muchas gracias!

      Francisco Ramos

      July 3, 2012 at 6:18 pm

  29. gracias x el aporte me sirvió mucho para cultura general y básica…..

    baylover

    August 1, 2012 at 4:47 pm

  30. felicitaciones por su buen trabajo!!! gracias por la informacion ..me sirvio mucho para aclarar mis dudas..
    pues sigan a delante con la programacion y exitos OK.

    laban gupioc orlando

    October 20, 2012 at 10:07 pm

  31. gracioa por la ayuda

    iveth

    October 26, 2012 at 2:54 pm

  32. Bueniiiiisimo brooo Gracias mil :D

    Gabriel Valencia

    November 7, 2012 at 2:06 pm

  33. gracias

    mary

    December 10, 2012 at 10:47 am

  34. muchas gracias esta de 10 este tuto

    flony

    December 15, 2012 at 11:05 pm

  35. Esta Muy Bueno Tu Trabajo (Like)

    "Luis" #include

    February 21, 2013 at 10:52 am

  36. Esto Me Ayudo Mucho =)

    "Luis" #include

    February 21, 2013 at 10:53 am

  37. Muchas gracias por esta información me ayudo muchisimo! Saludos desde Paragay

    Juan Jose Alegre

    March 18, 2013 at 10:27 pm

  38. ya se de donde saca las tareas el wey de mi maestro.

    anonimo por si ve mi maestro el comentario

    April 4, 2013 at 8:17 pm

  39. Muchas gracias saludos desde la Pontificia Universidad Catolica de Valparaiso, Chile!

    Pato

    October 15, 2013 at 11:29 pm

  40. gracias… XD

    César Iván Delgado Ailva

    October 24, 2013 at 5:05 am

  41. Buen aporte gracias me ha aclarado algunas dudas

    drv

    December 2, 2013 at 4:53 am

  42. Aún teniendo mucho tiempo este aporte, sigue ayudando a nosotros los iniciadores.
    Gracias!

    Ricardo

    December 3, 2013 at 1:51 pm

  43. Hola. Muchas gracias por tomarte el tiempo de escribir esto. Ha pasado unos buenos años ya pero aún sigue siendo muy útil.
    Saludos.

    Betto Rodriguez

    March 22, 2014 at 10:53 pm

  44. gracias muy buenas respuestas encuentro aca

    wilson

    July 15, 2014 at 11:10 pm

  45. yes muy buena

    meryderu

    October 2, 2014 at 10:47 pm

  46. […] Para mas información acerca de matrices dinamicas pueden consultar el siguiente enlace: https://ronnyml.wordpress.com/2009/07/04/vectores-matrices-y-punteros-en-c/ […]

  47. […] here is the web page that help me for this mastery https://ronnyml.wordpress.com/2009/07/04/vectores-matrices-y-punteros-en-c/ […]

    #Mastery23

    May 6, 2015 at 8:52 pm

  48. Thank you so much very useful

    joserafael1990

    May 16, 2015 at 11:17 pm

  49. muy buena informacion gracias entendi mas que a mi profesor que no le he entendido nada en todo el semestre gracias podrias hacer una tutorias de todo seria muy chevere asi como esta informacion gracias (Y)

    juancardenas21

    May 19, 2015 at 9:50 pm

  50. Simplemente genial amigo…excelente explicación dejas todo bien claro…yo estoy empezando a programar
    estoy en el segundo año de ingeniería en informatica y me ayudo bastante tu tutorial…gracias

    Jose

    May 28, 2015 at 1:59 pm

  51. Sinceramente perfecto para los que iniciamos, muchas gracias :D

    Zteven

    June 4, 2015 at 12:00 pm

  52. Muchas gracias por el aporte! :D Muy honorable tu iniciativa de compartir información con quienes más lo necesitan n.n

    Giancarlo Tupac Gutierrez

    November 5, 2015 at 10:44 am

  53. Gracias, yo soy un novato, aun no entiendo bien lo de punteros, pero muy buen aporte, se agradece

    william

    May 18, 2016 at 9:02 pm


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: