Anda di halaman 1dari 9

UNIVE

ERS
SIDA
AD NACI
N ONA
AL DE
D
I
INGE
ENIE
ERIA
A

FA
ACUL
LTAD
D DE
E ING
GENIE
ERIA
MECANNICA
A

COM
MPUTACIONN I_MB
B543
A: PUNT
TEMA TEROSS

Ingg. Daniel Osorio Maldonad


M do
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

INTRODUCCION A PUNTEROS
Un puntero es una variable que contiene una direccin de memoria.
Normalmente esta direccin es una posicin de otra variable en la
memoria. Si una variable contiene la direccin de otra variable,
entonces se dice que la primera variable apunta a la segunda.
La siguiente figura Ilustra esta definicin.
Variable Direccin
de memoria en memoria
1000
0x123AD4
1001
0X322EF

1002
0X1348AC
1003
0X23512D

Tambin se dice Un puntero es una variable... la cual corresponde a un


dato o a una variable que contiene al dato. Los punteros se utilizan
para crear y manipular estructuras de datos, para asignar
memoria dinmicamente y para proveer el paso de argumentos
por referencia en las llamadas a funciones.
Otra definicin :
Un puntero es una variable que tiene la direccin de ..", es decir
"apunta a " a otra variable, incluyendo otra variable, UN ARRAY, UNA
CADENA, UNA UNION u otro puntero.

CREACION DE PUNTROS
Un puntero puede apuntar a un objeto de cualquier tipo, incluyendo
estructuras, funciones, etc...Un puntero se declara precediendo el
identificador que referencia al puntero, por el operador de indireccin
(*), el cual significa "puntero a ". Un puntero siempre apunta a un
objeto
particular .Un puntero no inicializado tiene un valor desconocido.
Si una variable va a contener un puntero, entonces se debe declarar como
tal:
Una variable de tipo puntero se declara as :
tipo *var_puntero;
tipo : Especifica el tipo del objeto apuntado y puede ser
cualquier
tipo,incluyendo tipos agregados.
*var_puntero :Nombre de la variable apuntador.
ejem:+
int *pint /* pint es un puntero a un entero */
char *pnom ,start /* pnom es un puntero a caracteres */
double *p, *q; /* p y q son punteros a reales */
LOS OPERADORES PUNTEROS
Se distinguen 02 operadores esenciales :* & . El & es un operador
monario que devuelve la direccin de memoria de su operando. Un operador
monario solo requiere un operando) Por ejemplo.
Var_dir = &var;
Pone la direccin de memoria de la variable var en var_dir. Esta
direccin es una posicin interna en la memoria del computador. La
direccin no tiene que hacer nada con el valor de var . Se puede
recordar el funcionamiento de & como devolviendo la direccin de la

Ing.DanielOsorioMaldonado Pgina2
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

variable a la que precede. Por tanto, se puede leer la sentencia de


asignacin como que var_dir recibe la direccin de var .
Para entender esta asignacin: suponer que la variable var situada en
la direccin 1850. Despus de la asignacin, var_dir tendr el valor
1850.
El segundo operador, * , es el complemento de & . Es un operador
monario que devuelve el valor de la variable situada en la direccin que
sigue. . Por ej: si var_dir contiene la direccin de memoria de la
variable var , entonces
Vale = *var_dir
Pondr el valor de var_dir en Vale. Por ejemplo si var_dir
originalmente tenia el valor de 150,entonces despus de esta
asignacin, Vale tendr el valor de 150 ya que es el valor guardado en
la posicin 1850, que es la direccin de memoria que asigno a var_dir .
Recordar que el funcionamiento del * como en la direccin . As en
este caso se leera la sentencia dad como Vale recibe el valor de la
direccin var_dir
//Programa que usa dos sentencias //de asignacin
//dando a imprimir el numero 100
#include<iostream.h>
#include<conio.h>
main(){
int *var_dir, var, vale;
var =100;
var_dir =&var;/*coge la direccion del contador */
vale =*var_dir; /* coge el valor de esta direccion */
cout<<"La direccion &var es: " <<var_dir <<endl
<<"El valor de esta direccion es *var_dir : "<<*var_dir;

getch();}
1. /* Programa de asignacion */
#include<iostream.h>
#include<conio.h>
main ( ) {
unsigned int a,*p,*q;
cout<<"Ingrese el Valor de a : ";
cin>>a;
p=&a; /* asigna la direccion de a, a la variable p */
/* p apunta a la variable entera de a */
q=p; /* La direccion que contiene p se asigna a q */
cout<<"La Direccion de "<<a<<" esta dada por :"<<p<<endl;
cout<<"En la direccion de 'a' esta el valor "<<*q;
getch();}
2. #include<iostream.h>
#include<conio.h>
main ( ) {
float total =11.70;//declara e inicializa total
float &suma=total;//declara otro nombre para total
cout<<"suma ="<<suma<<endl;
suma=31.60; //cambia el valor total
cout<<"Total ="<<total<<endl;
getch();
}
/*suma = 11.7
Total = 31.6 */
3. /*Programa que usa punteros a char, en este caso se trata de del
conocido programa zodiaco */
#include<iostream.h>
#include<conio.h>
#define N 12

Ing.DanielOsorioMaldonado Pgina3
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

#include<stdlib.h>
#include<ctype.h>
char *nombre(int b);
int signo(int n,int m);
int meses[N]={31,28,31,30,31,30,31,31,30,31,30,31};
main(){
int dd,mm,b;char rp; for(;;){
system("cls");
do{
cout<<"Ingrese la Fecha de Nacimiento :"<<endl
<<"\n Dia ...";cin>>dd;
cout<<"\n Mes ...";cin>>mm;
}while(dd>meses[mm-1]);
b=signo(dd,mm);
cout<<"\nSu SIGNO es"<<nombre(b);
cout<<endl
<<"Otro signo [S][N] :";
rp=toupper(getch());
if(rp=='N')break;}
}
int signo(int dd,int mm){
register int i;
int dias =0;
int j=0;
static int estrella[N] =
{20,50,79,110,140,171,201,232,265,295,326,356};
for(i=0;i<mm-1;i++)
dias +=meses[i];
dias+=dd;
if(dias<=20 || dias>365)
return(j);
else{
j=1;
while(dias>estrella[j++]);
}
return(j-1);
}
char *nombre(int b){
char *astro[
]={"Capricornio","Acuario","Picis","Aries","Tauro","Geminis"
,"Cancer","Leo","Virgo","Libra","Escorpio","Sagitario"};
return(astro[b]);
}

OPERACIONES ARITMTICAS
Con punteros solamente se pueden realizar las operaciones de + y
Ejemplo:
4. #include<iostream.h>
#include<conio.h>
Int *p
cout<<*p++;
cout<<*p--;
cout<<p+=3;
cout<<p-=4;
getch( );
}
5. #include<iostream.h>
#include<conio.h>
void main(){ clrscr();
int *p,x;
cout<<"\nIngrese el valor de x ";cin>>x;
p=&x;
cout<<' '<<*p<<endl;
cout<<p;
cout<<' '<<*p++<<endl;
cout<<p<<endl;

Ing.DanielOsorioMaldonado Pgina4
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

cout<<*p--;
//cout<<*p+=3;
//cout<<*p-=4;
getch();
}
6. /*Programa que realiza Operaciones aritmtica con Punteros*/
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main(){
char A='a';
char *cp=&A;//crear e inicializar un puntero a char
double d=1.119;
double *dp=&d;//crear e inicializar un puntero a double
char *cp2=cp+1;
double *dp2=dp+1;
system("cls");
cout<<"\nAdicion y Sustraccion :";
cout<<"cp2=cp+1;dp2=dp+1;\n";
cout<<"cp2-cp="<<(cp2-cp)<<'\n';
cout<<"dp2-dp="<<(dp2-dp)<<'\n';
cout<<"(int)cp2-(int)cp="<<((int)cp2-(int)cp)<<'\n';
cout<<"(int)dp2-(int)dp="<<((int)dp2-(int)dp)<<'\n';
cout<<"\n\nIncremento y Decremento :\n";
cout<<"cp2=cp;dp2=dp;cp2--;cp2--;dp2++;dp2++;\n";
cp2=cp;dp2=dp;
cp2--;cp2--;
dp2++;dp2++;
cout<<"cp-cp2="<<(cp-cp2)<<'\n';
cout<<"dp2-dp="<<(dp2-dp)<<'\n';
cout<<"(int)cp-(int)cp2="<<((int)cp-(int)cp2)<<'\n';
cout<<"(int)dp2-(int)dp="<<((int)dp2-(int)dp)<<'\n';
getch();
}
/*
Adicion y Sustraccion :cp2=cp+1;dp2=dp+1;
cp2-cp=1
dp2-dp=1
(int)cp2-(int)cp=1
(int)dp2-(int)dp=8

Incremento y Decremento :
cp2=cp;dp2=dp;cp2--;cp2--;dp2++;dp2++;
cp-cp2=2
dp2-dp=2
(int)cp-(int)cp2=2
(int)dp2-(int)dp=16
*/
7. /*Programa que usa punteros a char, en este caso se trata de del
conocido
programa zodiaco */
#include<iostream.h>
#include<conio.h>
#define N 12
#include<stdlib.h>
#include<ctype.h>
char *nombre(int b);
int signo(int n,int m);
int meses[N]={31,28,31,30,31,30,31,31,30,31,30,31};
void main(){
int dd,mm,b;char rp; for(;;){
clrscr();
do{

Ing.DanielOsorioMaldonado Pgina5
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

cout<<"Ingrese la Fecha de Nacimiento :"<<endl<<"\n Dia ..."; cin>>dd;


cout<<"\n Mes ...";cin>>mm;
}while(dd>meses[mm-1]);
b=signo(dd,mm);
cout<<"\nSu SIGNO es "<<nombre(b);
cout<<endl <<"Otro signo [S][N] :";
rp=toupper(getch());
if(rp=='N')break;}
}
int signo(int dd,int mm){
register int i;
int dias =0;
int j=0;
static int estrella[N]={20,50,79,110,140,171,201,232,265,295,326,356};
for(i=0;i<mm-1;i++)
dias +=meses[i];
dias+=dd;
if(dias<=20 || dias>365)
return(j);
else{
j=1;
while(dias>estrella[j++]);
}
return(j-1);
}
char *nombre(int b){
static char *astro[
]={"Capricornio","Acuario","Picis","Aries","Tauro","Geminis"
,"Cancer","Leo","Virgo","Libra","Escorpio","Sagitario"};
return(astro[b]);
}
Ingrese la Fecha de Nacimiento :
Dia ...12
Mes ...02
Su SIGNO es :Acuario
Otro signo [S][N] : -
------------------------
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
main(){char nombre[20],*filiacion, primero[20];
cout<<"Ingrese un nombre :"; gets(primero);
filiacion=strcpy(nombre,primero);
cout<<"El nombre Ingresados es :"<<filiacion;
getch();
}

#include<iostream.h>
#include<conio.h>
void LeerABCD(float &a,float &b,float &c,float &d){
cout<<"Ingrese el valor de a = ";cin>>a;
cout<<"Ingrese el valor de b = ";cin>>b;
cout<<"Ingrese el valor de c = ";cin>>c;
cout<<"Ingrese el valor de d = ";cin>>d;
}
float MenABCD(float *x,float *y,float *z,float *w);
main(){
float a,b,c,d;
LeerABCD(a,b,c,d);
/*llama a la funcio Men_abc
y pasa la direccion del menor de a b y c*/
cout<<"el menor valor de "<<a<<' '<<b<<' '<<c<<"y "<<d<<" es:\n"
<<MenABCD(&a,&b,&c,&d);
//cout<<"\n y su direccion es:"<<&menor2;

Ing.DanielOsorioMaldonado Pgina6
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

getch();
}
float MenABCD(float *x,float *y,float *z,float *w){
float menor,menor1,menor2;
if(*x<*y)
menor=*x;
else
menor=*y;
if(*z<menor)
menor1=*z;
else
menor1=menor;
if(*w<menor1)
menor2=*w;
else
menor2=menor1;
return(menor2);
}

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
main(){
int enteros[50],*punteros[50];
short i;
unsigned N;
int *aux;
system("cls");randomize();
cout<<"INTRODUCE el Numero N : ";
cin>>N;
for(i=0;i<N;i++)
enteros[i]=rand()%87;
for(i=0;i<N;i++)
punteros[i]=&enteros[i];
for(i=0;i<N-1;i++)
{
if((*punteros[i]>(*punteros[i+1])))
{ aux=punteros[i];
punteros[i]=punteros[i+1];
punteros[i+1]=aux;
i=-1;}
}
cout<<"\nLos Numeros Introducidos han sido :{";
for(i=0;i<N;i++)
cout<<' '<<enteros[i];
cout<<"}";
cout<<"\nEl Orden de los numeros es : {";
for(i=0;i<N;i++)
cout<<' '<<*punteros[i];cout<<"}";
getch(); }
/*INTRODUCE el Numero N : 5
Los Numeros Introducidos han sido :{ 44 54 46 18 23}
El Orden de los numeros es : { 18 23 44 46 54}

ASIGNACION DINAMICA DE MEMORIA


/*Vector Generado al Azar usa asignacin dinmica de memoria */
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int *n; //n inicialmente no apunta a nada
main(){
int i,M;

Ing.DanielOsorioMaldonado Pgina7
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

randomize();
n=new int[100];
cout<<"ingrese el valor de M :" ; cin>>M;
for(i=0;i<M;i++)
n[i]=rand()%100;
for(int i=0;i<M;i++)
cout<<"\nValor del Item n["<<i<<"]="<<n[i]
<<"=>Direccion en memoria :" <<&n[i];
int N_Mayor=0;
int N_menor=99;
for(int i=0;i<M;i++) {
if(n[i]>N_Mayor)
N_Mayor=n[i];
if(n[i]<N_menor)
N_menor=n[i]; }
cout<<"\nEl mayor Valor es "<<N_Mayor<<endl
<<"El Menor Valor es "<<N_menor;
cout<<"\n\nAhora se Liberar la Memoria Reservada "<<endl;
delete []n;
getch();
}
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>

main(){
float numcalif;
short i;
cout<<"Introduzca el Numero de calificaciones a procesar ";
cin>>numcalif;

float *calif=new float[numcalif]; // se crea el arreglo


float S=0.0,Promedio;

for(i=0;i<numcalif;i++){
cout<<"Introduzca una Calificacion ";
cout<<i<<" : ";cin>>calif[i];}
cout<<"\nSe creo un arreglo para "<<numcalif<<" Numeros Reales \n";
cout<<"Los valores almacenados en el arreglo son : ";
for(i=0;i<numcalif;i++)
cout<<"\n "<<i<<": Nota "<<calif[i];
cout<<endl;
cout<<"La Suma y Promedio de las Notas : "; for(i=0;i<numcalif;i++)
S+=calif[i];
Promedio =S/numcalif;
cout<<"La Suma es "<<S<<"\nY el Promedio es "<<Promedio;
delete []calif;
//devuelve el espacio de //Almacenaje al montn
getch();}

PUNTEROSYARRAYS
Existe una gran relacin entre los punteros y los arrays estticos, ya
que en realidad estos ltimos son punteros encubiertos que apuntan al
elemento inicial del vector. Al declarar un vector, el nombre del
mismo es un puntero a vector[0]. Al apuntar a un vector podemos
utilizar sobre l las operaciones del apartado anterior:

int *p, a;
int vector[4]={ 5,6,1,4};
p = vector;
p[3] = 10; // escribimos 10 en vector[3]
(equivale a *(p+3)=10)
p++; // p apunta a vector[1]

Ing.DanielOsorioMaldonado Pgina8
UNI FIM
AREA ACADEMICA DE CIENCIAS BASICAS Y HUMANIDADES
COMPUTACION I

a = *(p+2) + *(vector+1); // a vale 1+6=7


p=p+2; // p apunta a vector[3]
p = vector+2; // p apunta a vector[2]

Que valor se guarda sobre a segn este programa?

main() {
int v[4] = { 2,3,5,11}, a, *p;
p = v+2;
p--;
a = *p + *(p+1) + *(v+1) + p[2];
}

Ing.DanielOsorioMaldonado Pgina9

Anda mungkin juga menyukai