Академический Документы
Профессиональный Документы
Культура Документы
GUIA DE LABORATORIO
PUNTEROS
Introduccin:
Un puntero es una variable que contiene la direccin de un objeto ya sea otra variable, un vector,
estructura, etc . Cuando se declara un puntero ste contiene una direccin arbitraria, si leemos a
dnde apunta nos dar un valor indefinido y si se escribe en tal direccin estamos variando el
contenido de una posicin de memoria. Los punteros son tiles para: modificar los argumentos
en las funciones, asignacin dinmica de memoria y la optimizacin de uso de la misma.
La presente gua pretende ejemplificar el uso de los punteros en diferentes situaciones para una
mejor comprensin de su uso.
Objetivo:
Que el estudiante conozca y practique el uso de los punteros en C.
Ejemplo 1
Objetivo del programa: Mostrar el uso de los operadores bsicos en la declaracin de punteros
Empleando el direccionamiento y el operador de indireccin.
#include <stdio.h>
#include <conio.h>
void main(void) {
int a;
int *punt; //declaracin de puntero.
a=57; //inicializacin de variable
punt=&a; //asignacin de direccin al puntero.
clrscr();
printf("a = %d", a); //imprimo valor de variable
printf("\n&a = %x", &a); //imprimo direccin variable apuntada (en hexadecimal)
printf("\npunt = %x ", punt); //imprimo la direccin guardada (la de la variable apuntada)
printf("\n*punt = %d", *punt); //imprimo el contenido de la direccin apuntada.
printf("\ntamao puntero %d", sizeof(punt));
getch();
}
Ejemplo 2
Objetivo del programa: Manipular el contenido de variables de diferentes tipos de datos a
travs de la aplicacin de punteros.
#include <stdio.h>
#include <conio.h>
void main() {
char carac='A', *r;
int a=12,b=45, c;
ESTRUCTURAS DE DATOS
CICLO II
1
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#define MAXCOL 30
void main() {
int nfila, ncol, f, c,(*a)[MAXCOL];
clrscr();
puts("Intro n de filas:");
scanf("%d", &f);
puts("Introducir numero de columnas:");
scanf("%d", &c);
puts("Llenamos el array:");
for(nfila=0; nfila<f; nfila++)
for(ncol=0; ncol<c; ncol++) {
printf("(*(a+%d)+%d) = ", nfila, ncol);
scanf("%d", *(a+nfila)+ncol);
}
puts("Imprimimos el array:");
for(nfila=0; nfila<f; nfila++)
{
for(ncol=0; ncol<c; ncol++)
printf(" %d",*(*(a+nfila)+ncol));
puts("");
ESTRUCTURAS DE DATOS
CICLO II
2
}
getch();
}
Ejemplo 4
Objetivo del programa: Referenciar a un arreglo como un puntero a un grupo de arreglos
contiguos.
#include <stdio.h>
#include <conio.h>
void main() {
int x[2][3], fil, col;
clrscr();
puts("Llenamos el array");
for(fil=0; fil<2; fil++)
for(col=0; col<3; col++)
{
printf("x[%d][%d] = ", fil, col);
scanf("%d", &x[fil][col]);
}
printf("\nImprimimos usando un puntero a un grupo de arrays:\n");
printf("\nPRIMERA FILA:\n");
for(col=0; col<3; col++)
printf(" %d", (*x)[col]);
printf("\nSEGUNDA FILA:\n");
for(col=0; col<3; col++)
printf(" %d", (*(x+1))[col]);
getch();
}
Ejemplo 5
Objetivo del programa: Mostrar el acceso al contenido de un arreglo a travs de la declaracin
de un puntero hacia esa estructura.
#include <conio.h>
#include <stdio.h>
void main() {
int mat[] = {1,2,3,4}, *pmat, i;
clrscr();
printf("\Empleamos notacin decimal\n");
printf("Hacemos que el puntero seale al primer elemento del array: pmat = mat");
pmat = mat;
//pmat=&mat[0]; //ES LO MISMO QUE pmat =mat
printf("\nComprobamos los valores: ");
printf("\nDireccin de inicio del array: mat = %u", &mat[0]);
getch();
printf("\nDireccin de pmat: &pmat = %u", &pmat);
ESTRUCTURAS DE DATOS
CICLO II
3
getch();
printf("\n Imprimimos las direcciones de memoria:\n");
for(i=0; i<4; i++)
{
printf("\n&mat[%u] = %u (pmat+%u) = %u ", i, &mat[i], i, (pmat+i));
printf(" mat[%u] = %u *(pmat+%u) = %u" , i, mat[i], i, *(pmat+i));
}
getch();
}
Ejemplo 6
Objetivo del programa: Declarar un puntero a una cadena de caracteres e imprimirlo carcter
a carcter hasta que detecta, en el bucle do...while el carcter nulo
de final de cadena ('\0')
#include <stdio.h>
#include <conio.h>
void main() {
char *nombre = "PEPE PEREZ";
int i=0;
clrscr();
do
printf("%c", *(nombre+i));
while(*(nombre+i++)); //postincremento de i, para cambiar VCB
puts(" "); //imprime blanco ,m s salto de lnea.
puts(nombre);
getch();
}
Ejemplo 7
Objetivo del programa: Manipular estructuras de memoria estticas, empleando subndices y
aritmtica de punteros.
#include <stdio.h>
#include <conio.h>
void main() {
float mat[2][4] = {
{1.45, -2.35, -14.08, 17.3}, //primera fila
{20, 2.95, 0.082, 6.023} //segunda fila
};
int i, j;
clrscr();
puts("Imprimimos las direcciones de memoria y valores contenidos:");
puts("\nDirecccin de memoria &mat[i][j] \t\tContenido mat[i][j]");
for(i=0;i<2; i++)
ESTRUCTURAS DE DATOS
CICLO II
4
Ejemplo 8
Objetivo del programa: acceder a los datos de un arreglo bidimensional, empleando subndices
y aritmtica de punteros.
Ejemplo 9
Objetivo del programa: Emplear notacin de punteros para manipular un arreglo
unidimensional de punteros
ESTRUCTURAS DE DATOS
CICLO II
5
Ojo es vector y se maneja como matriz corregir en 9 y 10 ver si se deja con un ciclo o 2.
Ejemplo 10
Objetivo del programa: Presentar un arreglo unidimensional de punteros y un puntero a
puntero, introducirle valores e imprimirlo.
#include <stdio.h>
#include <conio.h>
void main() {
int i,j;
int *p[4]; //array de punteros//
int **px=p; //px es un puntero a un puntero//
clrscr();
printf ("Introduzca 16 valores enteros:\n");
for (i=0; i<4; i++)
for (j=0; j<4; j++)
scanf ("%d", &px[i][j]);
ESTRUCTURAS DE DATOS
CICLO II
6
Ejemplo 11
Objetivo del programa: Mostrar las direcciones de memoria y los contenidos de la misma, al
emplear arreglos unidimensionales y aritmtica de punteros
#include <stdio.h>
#include <conio.h>
void main() {
int mat[] = {2, 16, -4, 29, 234, 12, 0, 3}, i =0;
system(cls);
puts("Imprimimos las direcciones de memoria y valores contenidos:");
puts("\nDirecccin de memoria &mat[i] \t\tContenido mat[i]");
for ( ; i<8 ; i++)
printf("\n\t&mat[%d] = %p \t\t mat[%d] = %d", i,&mat[i], i, mat[i]);
getch();
printf("\n\nRepetimos los resultados empleando notacin de punteros:\n");
getch();
puts("\nDirecccin de memoria mat + i \t\tContenido *(mat+i)");
for( i=0 ; i<8 ; i++)
printf("\n\tmat+%d = %p \t\t\t *(mat+%d) = %d", i, mat+i, i, *(mat+i));
getch();
}
EJERCICIOS
1. Un programa C contiene la siguiente declaracin:
static char *color[6] = {red, green, blue, white, black, yellow};
a) Cul es el significado de color?
__________________________________________________________________
b) Cul es el significado de (color+2)?
__________________________________________________________________
c) Cul es el valor de *color?
__________________________________________________________________
d) Cul es el valor de *(color + 2)?
__________________________________________________________________
e) Cul es la diferencia de color[5] y *(color+5)?
CICLO II
7
ESTRUCTURAS DE DATOS
CICLO II
8