Blog, para facilitar del Lenguaje de Programación C
Punteros.
Los Punteros o Apuntadores, son variables que contienen la dirección de otra variable.
Los usos principales, que tienen, los punteros, son los siguientes:
->Nos ayuda, para que una función devuelva más de un valor. Por ejemplo, una función que devuelva un vector de enteros, en dicha función mandamos la dirección del primer elemento a la función principal, y a partir de ella, imprimimos todos los valores contenidos en el vector.
->Mejor uso de la memoria dinámica. Esto es lo que más nos tiene cuenta, el lector debe tener presente que, el uso de punteros, ayuda a ahorrar memoria y por consiguiente, hace más efectivo el uso y administración de la misma.
Declaración de Punteros.
La forma de declarar un apuntador, es la siguiente:
int *p;
int->indica que, es un puntero hacia un entero.
*->indica al compilador que esa variable, es un puntero
p-> Es el identificador del puntero.
Otros ejemplos:
float *q; /*apuntador hacia un flotante*/
char *z; /*puntero que contiene la dirección de una variable que guarda un carácter */
Para referirnos a un valor a través de un apuntador, lo hacemos mediante un proceso llamado indireccion.
Por ejemplo, para mandar a impresión el valor entero, hacia el cual a punta “p”, sería así: printf(“%d”, *p);
Los punteros, pueden ser inicializados a 0, NULL ó alguna dirección válida:
float *p1;
p1=0;
p1=NULL;
Ahora bien, para guardar la dirección de alguna variable, en un puntero se tiene &->Operador de Dirección.
P1=&a;
Ejemplos
1. Diseñe un programa que muestre el uso de operadores básicos en la declaración de punteros empleando el direccionamiento y el operador indireccion.
#include <stdio.h>
#include <conio.h>
main()
{
int a;
/*Declaración de un puntero a un entero */
int *p;
clrscr();
printf("Ingrese un valor ENTERO para la variable:\n");
scanf("%d", &a);
while(a<0)
{
printf("ERROR, el valor debe ser mayor que cero:\n");
scanf("%d", &a);
}
clrscr();
/*Limpiamos la pantalla */
printf("a=%d\n", a); /*Imprimo el valor de a*/
printf("La dirección de a es %p\n", &a);
printf("*p=%p\n", p); /*Imprimo la dirección que guarda p*/
/*imprimo el valor guardado en la dirección a la que apunta p*/
printf("a=%d\n", *p);
printf("El tamaño de *p es %d\n", sizeof(p));
getch();
return 0;
}
2. Diseñe un programa, que sume dos variables de tipo entero, por medio de apuntadores.
#include <stdio.h>
#include <conio.h>
main()
{
int a, b, c;
int *p1, *p2, *p3; /*declaración de los punteros */
printf("Ingrese el valor de a:\n");
scanf("%d", &a);
printf("Ahora el valor de b:\n");
scanf("%d", &b);
c=a+b;
printf("a+b=%d\n", c);
/*asignamos las direcciones a los punteros correspondientes/
p1=&a;
p2=&b;
printf("*p1 + *p2=%d\n", *p1+*p2);
p3=&c;
printf(" Dirección de a es %p\n Dirección de b es %p\n Y la de c es %p\n\n", p1, p2, p3);
getch();
return 0;
}
3. Programa que lee un arreglo y una matriz usando aritmética de punteros */
#include <stdio.h>
#include <conio.h>
#define M 3
#define N 3
main()
{
int x[3][3], y[3];
int f=0,c=0;
clrscr();
for(f=0; f< M; f++)
{
for(c=0; c<N; c++)
{
printf("*(x+ %d)+%d)=", f,c);
scanf("%d", *(x+f)+c);
}
printf("Elemento %d del vector:\n", f);
scanf("%d", &y[f]);
}
printf("IMPRESIONES:\n");
printf("*** MATRIZ ***\n");
for(f=0; f<M; f++)
for(c=0; c<N; c++)
printf("%d", *(*(x+f)+c));
printf("\n*** VECTOR ***\n");
for(f=0; f<M; f++)
printf("%d", *(y+f));
getch();
return 0;
}