Vectores, Mutrlces y Punteros en c++
con 30 comenturlos
Estlmudos lectores y funs, les pldo dlsculpus por este humllde y senclllo post, se que este mlnl-tutorlul super bslco es unu
humlllucln u su lntellgenclu y profeslonullsmo, pero comprendun que esto vu dedlcudo u personus que como yo recln emplezun
con sus prlmeros plnlnos en C++. Espero de verdud le seu utll u ulgulen.
Escrlblr todo esto, me cost unu noche enteru y mucho cuf. Purte de los conceptos uqui los uprendi en cluses de lu U y mucho
tumbln lo uprendi por cuentu proplu. Asi que ugrudeclmlentos ul teucher Putrlclo del cuul uprendi muchislmo. Unu vez ms u
ustedes y u los tuntos mlles de seguldores que me leen u dlurlo lus dlsculpus del cuso.
Vumos lr uvunzundo de u pocos usi que no se preocupen y desesperen porfuvor, puclenclu. Lu ldeu es que estu seccln crezcu con
su uyudu, feedbuck y motlvucln. Luego vumos u ver e|emplos con ob|etos, cluses, sobrecurgu de operudores, mtodos de
busquedu, mus ordenucln, punteros, llstus, pllus, colus, templutes por uhoru slgo pructlcundo y huclendo slmples cosus con
este lenguu|e. Los cdlgos los compll con g++, el complludor de GNU.
VECTORES
Un vector, tumbln llumudo urruy(urreglo) unldlmenslonul, es unu estructuru de dutos que permlte ugrupur elementos del mlsmo
tlpo y ulmucenurlos en un solo bloque de memorlu |untos, uno despues de otro. A este grupo de elementos se les ldentlflcu por un
mlsmo nombre y lu poslcln en lu que se encuentrun. Lu prlmeru poslcln del urruy es lu poslcln 0.
Podriumos ugrupur en un urruy unu serle de elementos de tlpo enteros, flotuntes, curucteres, ob|etos, etc. Creur un vector en c++
es senclllo, segulmos lu slgulente slntuxlx: Tlpo nombre[tumunyo];
E|m:
1 int a[5];//Vector de 5 enteros
2 float b[5];//vector de 5 flotantes
3 Producto product[5];//vector de 5 objetos de tipo Producto
Podriumos tumbln lnlclullzur el vector en lu declurucln:
1 int a[] = {5,15,20,25,30};
2 float b[] = {10.5,20.5,30.5,12.5,50.5}
3 Producto product[] = {celular,calculadora,camara,ipod,usb}
Como huy 5 elementos en cudu urruy, uutomtlcumente se le uslgnur 5 espuclos de memorlu u cudu [Link] sl truto de creur
el vector de lu formu lnt u[]; el complludor mostrur un error, porque no lndlqu el tumuno del vector nl tumpoco lnlclullz sus
elementos.
Aslgno vulores u los elementos de un vector lndlcundo su poslcln:
1
int a[4] = 30; // le asigno el valor 30 a la posicin 4 del vector, es decir, al 5to
elemento.
2
product[2].setPrecio(300) // le asigno un precio de 300 al producto en la posicion 2, o
sea al tercer elemento.
Obvlumente el mtodo setPreclo() debe de estur lmplementudo.
Puru llenur, recorrer e lmprlmlr un vector podemos utlllzur un bucle for:
01 #include <iostream>
02 using namespace std;
03
04 int main()
05 {
06 int dim;
07 cout << "Ingresa la dimension del vector" << endl;
08 cin >> dim; // Supongamos que ingrese 10
09 int vector[dim]; // mi vector es de tamanyo 10
10
11 for(int i=0;i < dim;i++){
12 vector[i] = i * 10;
13 cout << vector[i] << " ";
14 }
15
16 return 0;
17 }
Lu sulldu del progrumu mostrur: 0 10 20 30 40 50 60 70 80 90
)ucll verdud? Blen uhoru creen 2 o ms vectores y emplecen u hucer funclones bslcus como sumur, restur, buscur, ordenur,
modu, etc que uyudun mucho u lr desurrollundo lu lglcu. No vule coplur y pegur, me|or es pructlcur, pructlcur y pructlcur.
Aqui unu funcln slmple puru sumur 2 vectores u y b y poner el resultudo en un tercer vector c
01 #include <iostream>
02 using namespace std;
03
04 void sumar(int a[], int b[], int c[],int dim){
05 for (int i=0; i<dim; i++) {
06 c[i]=a[i] + b[i];
07 }
08 }
09
10 void imprimir(int v[],int dim)
11 {
12 for(int i=0;i<dim;i++){
13 cout << v[i] << " ";
14 }
15 cout << endl << endl;
16 }
17
18 int main()
19 {
20 int dim;
21 cout << "Ingresa la dimension" << endl;
22 cin >> dim;
23
24 int a[dim];
25 int b[dim];
26 int c[dim];
27
28 for(int i=0;i<dim;i++){
29 a[i] = i * 10;
30 b[i] = i * 5;
31 }
32
33 cout << "Vector A " << endl;
34 imprimir(a,dim);
35
36 cout << "Vector B " << endl;
37 imprimir(b,dim);
38
39 sumar(a,b,c,dim);
40 cout << "Vector C " << endl;
41
42 imprimir(c,dim);
43 return 0;
44 }
Este progrumu me boturiu (sl lngreso unu dlmensln de 10):
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 puru tomur en cuentu:
Todo vector debe tener deflnldo un tlpo de duto.
Todo vector necesltu de unu dlmensln o tumunyo.
El cdlgo de urrlbu se puede me|orur muchislmo con ob|etos y cluses, este es solo un pequeno e|emplo.
MATRICES
Unu mutrlz es un vector de vectores o un tumbln llumudo urruy bldlmenslonul. Lu muneru de declurur unu mutrlz es c++ es
slmllur u un vector:
1 int matriz[fils][cols];
lnt es el tlpo de duto, mutrlz es el nombre del todo el con|unto de dutos y debo de especlflcur el numero de fllus y columnus. Lus
mutrlces tumbln pueden ser de dlstlntos tlpos de dutos como chur, flout, double,etc.
Lus mutrlces en c++ se ulmucenun ul lguul que los vectores en poslclones consecutlvus de memorlu. Usuulmente uno se huce lu
ldeu que unu mutrlz es como un tublero. Pero lnternumente el mune|o es como su deflnlclon lo lndlcu, un vector de vectores, es
declr, los vectores estun uno detrus del otro |untos.
Lu formu de ucceder u los elementos de lu mutrlz es utlllzundo su nombre e lndlcundo los 2 sublndlces que vun en los corchetes.
Sl Coloco lnt mutrlz[2][3]=10; //estoy uslgnundo ul cuurto elemento de lu terceru fllu el vulor 10. No olvldur que tunto fllus como
columnus se enumerun u purtlr de 0.
Bueno y puru recorrer unu mutrlz podemos usur lguulmente un bucle. En este cuso 2 for
1 for(int i=0;i<fils;i++){
2 for(int j=0;j<cols;j++){
3 matriz[i][j] = i % j;
4 }
5 }
PUNTEROS
El vulor de todus lus vurlules que mune|umos en nuestros progrumus se ulmucenun en memorlu y tlenen unu dlreccln. Un puntero
es unu vurluble especlul que upuntu u lu dlreccln de memorlu de unu vurluble. El puntero tlene u su vez su proplu dlreccln.
Todus estus dlrecclones tlenen un formuto hexudeclmul.
Los punteros son herrumlentus muy poderosus con muchus utllldudes y enormes ventu|us como veremos ms udelunte. A grundes
rusgos, un puntero me permlte despluzurme en lu memorlu, upuntur, redlrecclonur u clertus vurlubles, funclones, mtodos, ob|etos
sln necesldud de mover grundes bloques de dutos, lo cuul nos uhorru muchislmo el consumo de memorlu en los progrumus.
Un puntero se debe declurur de ucuerdo ul tlpo de duto ul que upuntu. E|em:
1 int *var; //Un puntero llamado var que podra apuntar a cualquier variable de tipo entero.
2 char *u;//puntero de tipo char
3 Persona *per;//puntero de tipo persona
Puru determlnur,uslgnur lu dlreccln de unu vurluble en c++, se usu el operudor & y puru obtener el contenldo de un puntero
utlllzumos el operudor * E|em:
1 int a;//entero
2 int *b;//puntero a entero
3 a = 20;//a tiene 20
4 b=&a;//asigno la direccion de a al puntero b
5
6 cout << b << endl; // imprira la direccion de memoria de a;
7 cout << *b;// imprimira 20, osea el contenido de a
Ahoru unullcemos lus slgulentes lnstrucclones y veumos como lus vurlubles vun cumblundo de vulor en tlempo de e|ecucln:
01 #include <iostream>
02 using namespace std;
03 int main () {
04 int a=10;
05 int b=20;
06 int *p,*p2;//punteros de tipo entero
07
08 cout << "ANTES" << endl;
09 cout << "Variable a = " << a << endl;
10
11 cout << "Direccion de a = " << &a << endl << endl;
12
13 cout << "Variable b = " << b << endl;
14 cout << "Direccion de b = " << &b << endl << endl;
15
16
cout << "Contenido de p (BASURA)= " << *p << endl;//tiene basura al principio, podria
inicializar con *p=0
17 cout << "Direccion de p = " << &p << endl << endl;
18
19 cout << "DESPUES" << endl;
20 a++;//incremento a
21 p= &a; //p ahora tiene a la direccion de a
22
23 cout << "Contenido de p = " << *p << endl;
24
25 p = &b;//p ahora tiene la direccion de b
26 *p +=20; // le sumo 20 al contenido de p, es decir, estoy incrementando el valor de b
27
28 cout << "Variable a = " << a << endl;
29 cout << "Variable b = " << b << endl << endl;
30
31 p=&a;//p ahora tiene la direccion de a
32 *p = a * 5;//contenido de p es igual al contenido de a * 5
33
34 cout << "Contenido de p = " << *p << endl;
35 cout << "Variable a = " << a << endl << endl;
36
37
cout << "Contenido de p2 (BASURA) = " << *p2 << endl;//tiene basura al principio,
podria inicializar con *p2=0
38 cout << "Direccion de p2 = " << &p2 << endl << endl;
39
40 p2 = p;//el contenido de p es asignado al contenido de p2
41 *p2 +=15;//incremento 15 al contenido de p2
42
43 cout << "Contenido de p2 = " << *p2 << endl;//igual al contenido de p
44 p++;//p apunta a otra direccion de memoria,se desplaza 4 bytes en memoria
45
cout << "Contenido de p (BASURA) = " << *p << endl;//el contenido de esa nueva
direccion
46
47 return 0;
48 }
Lu sulldu del progrumu:
ANTES
Vurluble u = 10
Dlrecclon de u = 0x22ff74
Vurluble b = 2
Dlrecclon de b = 0x22ff70
Contenldo de p (BASURA)= -1017291943
Dlrecclon de p = 0x22ff6c
DESPUES
Contenldo de p = 11
Vurluble u = 11
Vurluble b = 40
Contenldo de p = 55
Vurluble u = 55
Contenldo de p2 (BASURA) = 2293680
Dlrecclon de p2 = 0x22ff68
Contenldo de p2 = 70
Contenldo de p (BASURA) = 2293680
El contenldo de p y p2 ul prlnclplo es busuru porque no tlenen nlngun vulor uslgnudo uun. Podrlumos uslgnur el vulor NULL u un
puntero puru luego posterlormente en ulgun problemu que se me presente suber el estudo del puntero y suber sl contlene ulgo o
no, usi: lnt *p= NULL;