Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
Declaración de un puntero
Primero un puntero debe ser declarado, y luego inicializado o asignado
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.
1. Operador de incremento: ++
2. Operador de decremento: - -
3. Operador de suma: +
4. Operador de resta: -
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;
}
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;
}
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
#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;
}
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
}