Está en la página 1de 8

UNMSM

FACULTAD DE INGENIERIA INDUSTRIAL


(2017-1-18)
PROFESOR EDGAR RUIZ LIZAMA

PUNTEROS
Definición.- Un puntero es una variable distinguida cuya misión o propósito
es almacenar la dirección de memoria de otra variable.

Toda variable tiene cuatro atributos:

1. Tipo de dato: int, float, char, double, etc


2. Identificador o nombre: Cualquier nombre valido
3. Valor o contenido que depende del tipo de dato
4. Dirección o lugar en la memoria

Un puntero por ser una variable posee los cuatro atributos anteriores con la
excepción que el tercer atributo será la dirección de memoria de otra
variable.

Nota 1: Tanto la variable puntero como la variable apuntada deben ser del
mismo tipo.

Operadores especiales para los punteros


C y C++ proveen dos operadores para el trabajo con los punteros. Estos son:
1. Operador de referencia o de dirección.- Es el operador & (ampersand)
que se encarga de asignar la dirección de memoria de una variable a
un puntero.
2. Operador de desreferencia o de indirección.- Es el operador *
(asterisco) que se encarga de declarar una variable como un puntero a
otra variable.

Declaración de un puntero
Primero un puntero debe ser declarado, y luego inicializado o asignado

int a = 2526; // Variable de tipo entero


int *ptr; // Variable puntero a entero
ptr = &a; /* Asignación de la dirección del entero a al
puntero ptr */

EJEMPLO 1:
#include <iostream>
using namespace std;
int main()
{
int a = 2526; // Variable de tipo entero
int *ptr; // Variable puntero a entero
ptr = &a;/* Asignación de la dirección del entero a al puntero ptr */
cout<<"a = "<< a <<endl;
cout<<"ptr = "<< ptr << endl;
cout<<"Direccion de a = "<< &a <<endl;
cout<<"Valor al que apunta ptr = "<< *ptr << endl;
cout<<"Direccion de ptr = "<< &ptr << endl;
return 0;
}

ARITMETICA DE PUNTEROS
La aritmética de punteros, no tiene la misma connotación o significado que
la aritmética común.

Los operadores aritméticos válidos para punteros son:

1. Operador de incremento: ++
2. Operador de decremento: - -
3. Operador de suma: +
4. Operador de resta: -

Por ejemplo a un puntero se le puede sumar un entero

EJEMPLO 2
#include <iostream>
#define N 100
// Version 1.0
void IngresaArreglo(int *a, int n); //a es un puntero a un arreglo
de enteros
void PrintArreglo(int *a, int n);
using namespace std;
int main()
{
int Datos[N], n;
cout<<"Cuantos enteros? "; cin >> n;
IngresaArreglo(Datos, n);
PrintArreglo(Datos, n);
return 0;
}
void IngresaArreglo(int *a, int n)
{
for(int i = 0; i<n; i++)
cin >> a[i];
}
void PrintArreglo(int *a, int n)
{
cout<<"\nDatos en el arreglo"<<endl;
for(int i = 0; i<n; i++)
cout << a[i] << "\t";
cout<<endl;
}

EJEMPLO 3
#include <iostream>
#define N 100
// Version 2.0
void IngresaArreglo(int *a, int n); //a es un puntero a un arreglo
de enteros
void PrintArreglo(int *a, int n);
using namespace std;
int main()
{ int Datos[N], n;
cout<<"Cuantos enteros? "; cin >> n;
IngresaArreglo(Datos, n);
PrintArreglo(Datos, n);
return 0;
}
void IngresaArreglo(int *a, int n)
{ for(int i = 0; i<n; i++)
{ cin >> *a;
a++; // avanzar puntero
}
}
void PrintArreglo(int *a, int n)
{ cout<<"\nDatos en el arreglo"<<endl;
for(int i = 0; i<n; i++)
{ cout << *a << "\t";
a++;
}
cout<<endl;
}

EJEMPLO 4
#include <iostream>
#define N 100
// Version 3.0
void IngresaArreglo(int *a, int n);/*a es un puntero a un arreglo
de enteros */
void PrintArreglo(int *a, int n);
using namespace std;
int main()
{
int Datos[N], n;
cout<<"Cuantos enteros? "; cin >> n;
IngresaArreglo(Datos, n);
PrintArreglo(Datos, n);
return 0;
}

void IngresaArreglo(int *a, int n)


{
for(int i = 0; i<n; i++)
cin >> *a++;
}

void PrintArreglo(int *a, int n)


{
cout<<"\nDatos en el arreglo"<<endl;
for(int i = 0; i<n; i++)
cout << *a++ << "\t";
cout<<endl;
}

EJEMPLO 5
#include <iostream>
#define N 100
// Version 4.0
void IngresaArreglo(int *a, int n); //a es un puntero a un arreglo
de enteros
void PrintArreglo(int *a, int n);
using namespace std;
int main()
{
int Datos[N], n;
cout<<"Cuantos enteros? "; cin >> n;
IngresaArreglo(Datos, n);
PrintArreglo(Datos, n);
return 0;
}

void IngresaArreglo(int *a, int n)


{
for(int i = 0; i<n; i++)
cin >> *a++;
}

void PrintArreglo(int *a, int n)


{
cout<<"\nDatos en el arreglo"<<endl;
for(int i = 0; i<n/2; i++)
{
cout << *a << "\t";
a = a + 2;
}
cout<<endl;
}

CADENAS Y PUNTEROS
Existe una estrecha correlación entre las cadenas y los punteros. C y C++
tratan el identificador de una cadena como si fuera un puntero a la cadena

EJEMPLO 6. Escriba un programa que defina la función proceso, tal que


recibe un puntero a cadena y un carácter. La función procede a reemplazar
todas las vocales de la cadena por el carácter pasado en la lista de
parámetros.
/* Escriba un programa que defina la función proceso, tal que
recibe un puntero a cadena y un carácter. La función procede a
reemplazar todas las vocales de la cadena por el carácter pasado
en la lista de parámetros */
#include <iostream>
#include <stdio.h>
#define N 255
bool EsVocal(char c);
void Proceso(char *s, char c);
using namespace std;
int main()
{
char cad[N], c;
cout<<"Ingrese cadena: "; gets(cad);
cout<<"Ingrese caracter: "; cin.get(c);
Proceso(cad, c);
return 0;
}
bool EsVocal(char c)
{ switch(c){
case 'A':case 'E':case 'I':case 'O':case 'U':
case 'a':case 'e':case 'i':case 'o':case 'u':
return true;
default:
return false;
}
}
void Proceso(char *s, char c)
{ cout<<"\nCadena recibida = "<< s << endl;
char *t; // t es puntero a cadena de caracteres
t = s; // t apunta a lo mismo que apunta s
// Recorriendo la cadena
while(*t != '\0') // while(*t)
{
if (EsVocal(*t))
*t = c;
t++;
}
cout<<"\nCadena cambiada = "<< s << endl;
}
2014-2
PREGUNTA 3: Hilmar Hinojosa Lazo

Se tiene el siguiente programa:

#include <iostream>
using namespace std;
char* procesar( char *p );

int main()
{
char f[100], *z;
cout << endl << "Ingrese una frase: ";
gets( f );
z = procesar( f );
cout << endl << "Resultado: " << z << endl << endl;
cout << endl << "Ingrese otra frase: ";
gets( f );
z = procesar( f );
cout << endl << "Resultado: " << z << endl << endl;
return 0;
}

Un ejemplo de ejecución es:

Escriba el código de la función procesar( ) teniendo en cuenta que el procesamiento de


cadenas debe hacerse usando únicamente punteros. ( 6 puntos)

SOLUCION
// 6 PUNTOS
char* procesar( char *p )
{
static char x[100]; // cadena resultante
char *q, *r;
int c,i;

q = p;
r = x;
// ir hasta el final
while ( *p != '\0' )
p++;
// volver al inicio de la ultima palabra
while ( *p != ' ' )
p--;
p++;
// copiar la palabra en r
while ( *p != '\0' )
{
*r = *p;
r++;
p++;
}
// Ir al final de la primera palabra contando sus caracteres
c = 0;
while ( *q != ' ' )
{
c++;
q++;
}
// copiar la primera palabra en r, pero alreves
for(i = 0;i <= c; i++)
{
*r = *q;
r++;
q--;
}
// añadir marca de fin de cadena a r
*r = '\0';
return x; // devolver la cadena resultante
}

También podría gustarte