Está en la página 1de 36

PUNTEROS

PROF GPR
¿Que es puntero?
Es una variable que contiene la dirección de memoria de otra
variable.
¿Como se declara una variable puntero ?
• tipo *nombre_variable;
Sintaxis

• Declarar si una variable contiene una dirección de memoria.


Propósito • tipo define a que tipo de variable puede apuntar el puntero.

• int *punt;
Ejemplo • punt apunta a una variable tipo entero
Al declarar un puntero se debe indicar a
que tipo de dato apuntará.
string saludo=“hola” int x= 12;
string* p; int *p;

float x= 12.46;
float *p;
OPERADORES PUNTERO
• Devuelve la dirección de memoria de la
Operador de variable a la que precedE
Dirección (&) • Ejemplo: &Edad
• punt=&Edad
&=>ampersand

• Devuelve el valor de la variable situada en


Operador de la dirección que sigue
• Ejemplo: *punt
Indireccion (*) • M=*punt
Ejemplos
&Edad ? *punt ?
¿En que tipo de variable se puede almacenar estos valores?
punt= &Edad h= *punt
¿Cómo se declaran dichas variables?
Al declarar un puntero se debe indicar a
que tipo de dato apuntará.
string saludo=“hola”;
string *p;
p=&saludo; //El operador & devuelve la dirección de memoria de saludo
#include<iostream>
Ejemplo:
#include<conio.h>
using namespace std;
int main()
{
int x=35;
cout<<"El valor de x es:"<<x<<endl;
cout<<"La direccion de memoria de x es:"<<&x<<endl;
getch();
return 0;
}
#include<iostream>
using namespace std; PUNTEROS EN VARIABLE DE TIPO ENTERA
int main()
{
int x=5;
int *punt;
cout<<"La direccion de x es ==> &x = "<<&x<<endl;
punt=&x;
cout<<"La direccion de x es ==> punt = "<<punt<<endl;
cout<<"El valor de x es ==> x = "<<x<<endl;
cout<<"El valor de x es ==> *punt = "<<*punt<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int Edad=21,*punt; /*punt es un puntero que va almacenar la dirección de
memoria de una variable entera */
punt=&Edad; //punt almacena dirección de memoria de Edad
cout<<"El valor de Edad es:"<<*punt<<endl; // *punt => Edad
cout<<"La dirección de memoria de x es:"<<punt<<endl;
getch();
return 0;
}
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
float x,*dir_x; /* *dir_x es un puntero que va almacenar
la direccion de memoria de una variable float */
cin>>x;
dir_x=&x; //dir_x almacena dirección de memoria de x
cout<<"El valor de x es:"<<*dir_x<<endl;
cout<<"La direccion de memoria de x es:"<<dir_x<<endl;
getch();
return 0;
}
Operaciones con puntero
Que pasa en una matriz
Uso de puntero en arreglos
Debido a que los índices de los arreglos empiezan en cero para acceder a un determinado
elemento de un vector w, ejemplo cuarto elemento, se puede escribir:
w[3] ó *(w+3)
w[i] e igual a *(w+i)
En una matriz g cuyos contadores se inicializan a partir de cero, el acceso puede especificarse
como:
g[i][j] ó *(*(g + i)+j)
p[i][j] = *(*(p + i) + j)
OTRA FORMA: Matriz g[i][j] = *(punt + n°_de_columnas*i + j) donde punt=&g[0][0]
Nota:
El puntero es una de las características más
poderosas del lenguaje de programación C y
también una de las capacidades más difíciles de
dominar.
Los punteros nos permiten simular llamadas por
referencia, crear y manipular estructuras de
datos.
PUNTEROS- Definición
Definición: (según Deitel y Deitel)
Los punteros son variables que contienen direcciones de memoria como sus
valores. Por lo general una variable contiene directamente un valor específico.
Un puntero contiene la dirección de una variable que contiene un valor
específico. En este sentido, un nombre de variable se refiere “directamente” a un
valor y un puntero se refiere “indirectamente” a un valor.
Declaración:
int * ptr; & es un operador que regresa
int a; la dirección de su operando. & ampersand

a=7; ptr a
ptr=&a;
7
Un puntero puede ser inicializado a 0, NULL o a una dirección. Un apuntador con valor NULL
no apunta a nada. Ponerlo a 0 es igual a NULL, pero se prefiere NULL.

La representación del puntero en memoria sería:


ptr a
00FF8C 00FF0A 00FF0A 7

El operador * se conoce como “el operador de indirección o de desreferencia”, y nos retorna


El valor del objeto hacia el cual su operando apunta. Por ejemplo:

cout<<*ptr; /* Imprime el valor de la variable a, es decir, 7 */


El especificador de formato %p dentro del printf extrae la dirección de memoria en formato
Hexadecimal.
Ejercicio ejemplificador

#include <stdio.h>
int j, k; j
int *ptr;
0014F780 1 ptr
int main(void)
{ 0014F768 0014F774
j = 1; k
k = 2; 0014F774 2
ptr = &k;
printf("\n");
printf("j tiene el valor %d y está almacenado en %p\n",j,&j);
printf("k tiene el valor %d y está almacenado en %p\n",k,&k);
printf("ptr tiene el valor %p y está almacenado en %p\n",ptr,&ptr);
printf("El valor del entero al que apunta ptr es %d\n", *ptr);
getch();
return 0;
}
#include <stdio.h>
#include<conio.h> // usado por el getch()
int main(void)
{
int j, k;
int *ptr;
j = 1;
k = 2;
ptr = &k;
printf("\n");
printf("j tiene el valor %d y esta almacenado en %p\n",j,&j);
printf("k tiene el valor %d y esta almacenado en %p\n",k,&k);
printf("ptr tiene el valor %p y esta almacenado en %p\n",ptr,&ptr);
printf("El valor del entero al que apunta ptr es %d\n", *ptr);
getch();
return 0;
}
#include<iostream>
#include<conio.h>
using namespace std;
int x=10;
int *dir=&x;
int main()
{
int num;
int *dir1=&num;
cout<<&x<<endl;//direccion de x
cout<<dir<<endl;//direccion x
cout<<*dir<<endl;//contenido de direccion dir
cout<<"Ingrese un numero num=";
cin>>num;
cout<<"el valor de num es "<<num<<endl;
cout<<"El valor de la direccion de num es &num="<<&num<<endl;
cout<<"La dirección de num es "<<dir1<<endl;
cout<<"el contenido de la dirección de num es "<<*dir1<<endl;
getch();
return 0;
}
Que es el sizeof
La función sizeof, devuelve el tamaño en bytes que ocupa una variable o algún
tipo de dato.
Sintaxis
sizeof( tipo ) (1)
sizeof expresión (2)
Explicación
1) Devuelve el tamaño en bytes de la representación del objeto de tipo.
2) Devuelve el tamaño en bytes de la representación del objeto del tipo que
sería devuelto por la expresión, si es evaluable.
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{short int a;
int b;
float c;
double d;
cout<<"sizeof(a) --short int - es:"<<sizeof(a)<<endl;
cout<<"sizeof(b) --int -- es:"<<sizeof b<<endl;
cout<<"sizeof(c) --float-- es:"<<sizeof (c)<<endl;
cout<<"sizeof(d) --double-- es:"<<sizeof(d)<<endl;
cout<<"sizeof(char) es:"<<sizeof(char)<<endl;
getch();
return 0;
}
Tipo Declaración Numero de
bytes
short short int z; 2
int int z; 4
float float z; 4
double double z; 8
char char z; 1
Dirección de memoria de una variable
int *p;
p=&x; x
p p+1 p+2

3500 45
3500 3504 3508

Si a un puntero se le suma o resta un entero , este aumentará o


disminuirá el entero por el numero de bytes de la variable hacia la que
apunta el puntero.
#include<iostream>
using namespace std;
int main()
{
int num=45;
int *dir_num;
dir_num=&num;
cout<<"num es "<<*dir_num<<endl;
cout<<"Direccion de num es"<<dir_num<<endl;
cout<<"Direccion de num+1 es"<<dir_num+1<<endl;
cout<<"Direccion de num+2 es"<<dir_num+2<<endl;
system("pause");
return 0;
}
Dirección de memoria de un vector
int *p;
p=&x;
x[0] x[1] x[2] X[0]
p=&x[0];
3500 45
3500 3504 3508

Si a un puntero se le suma o resta un entero , este aumentará o


disminuirá el entero por el numero de bytes de la variable hacia la que
apunta el puntero.
#include<iostream>
using namespace std;
int main()
{
int num[]={10,20,30,40,50};
int *dir_num;

dir_num=&num[0]; /*señala al primer elem del arreglo


dir_num=num; /* solo para arreglos */
for(int i=0;i<5;i++){
cout<<"num["<<i<<"]="<<*dir_num++<<endl;;
}
for(int i=0;i<5;i++){
cout<<"Direccion de num["<<i<<"]="<<&num[i]<<endl;;
}
system("pause");
return 0;
}
Otros ejemplos
// Uso de punteros
#include <iostream>
#include<conio.h>
using namespace std;
int main()
{
int x;
int *dir_x;//se declara un variable puntero
dir_x=&x;
cout<<"Ingrese un numero:";
cin>>x;
if (*dir_x % 2==0)
cout<<"El numero"<<*dir_x<<"es par\n";
else
cout<<"El numero"<<*dir_x<<" es impar\n";
cout<<"usando printf \n";
printf("la direccion de x es %p\n",dir_x);
printf("El valor de x es %d \n",*dir_x);
getch();
return 0;
}
#include <iostream>
#include<conio.h>
using namespace std;
void cambio(int ,int );
int main()
{
int x,y;
cout<<"Ingrese valor de x=";
cin>>x;
cout<<"Ingrese valor de y="; void cambio(int x,int y)
cin>>y; {
cout<<" x="<<x<<" y="<<y<<endl; int t;
cambio(x,y); t=x;
cout<<" x="<<x<<" y="<<y<<endl; x=y;
getch(); y=t;
return 0; }
}
#include <iostream>
#include<conio.h>
using namespace std;
void cambio(int & ,int & );
int main()
{
int x,y;
cout<<"Ingrese valor de x=";
cin>>x; void cambio(int &x,int &y)
cout<<"Ingrese valor de y="; {
cin>>y; int t;
cout<<" x="<<x<<" y="<<y<<endl; t=x;
cambio(x,y); x=y;
cout<<" x="<<x<<" y="<<y<<endl; y=t;
getch(); }
return 0;
}
EJEMPLO:

#include <iostream>
#include<conio.h>
using namespace std;
void cambio(int * ,int * );
int main()
{
int x,y;
cout<<"Ingrese valor de x="; void cambio(int *a,int *b)
cin>>x; {
cout<<"Ingrese valor de y="; int t;
cin>>y; t=*a;
cout<<" x="<<x<<" y="<<y<<endl; *a=*b;
cambio(&x,&y); *b=t;
cout<<" x="<<x<<" y="<<y<<endl; }
getch();
return 0;
}
#include <iostream>
#include<conio.h>
using namespace std; void cambio(int &a,int &b)
void cambio(int & ,int & ); {
int main() int t;
{ cout<<"al iniciar cambio"<<endl;
int x,y; cout<<"Direccion &a="<<&a<<endl;
cout<<"Ingrese valor de x="; cout<<"Direccion &b="<<&b<<endl;
cin>>x; cout<<"valor de a="<<a<<endl;
cout<<"Ingrese valor de y="; cout<<"valor de b="<<b<<endl;
cin>>y; t=a;
cout<<" x="<<x<<" y="<<y<<endl; a=b;
cout<<"Direccion x="<<&x<<endl; b=t;
cout<<"Direccion y="<<&y<<endl; cout<<"al finalizar cambio"<<endl;
cambio(x,y); cout<<"Direccion &a="<<&a<<endl;
cout<<" x="<<x<<" y="<<y<<endl; cout<<"Direccion &b="<<&b<<endl;
cout<<"Direccion x="<<&x<<endl; cout<<"valor de a="<<a<<endl;
cout<<"Direccion y="<<&y<<endl; cout<<"valor de b="<<b<<endl;
getch(); }
return 0;
}

También podría gustarte