You are on page 1of 5

LENGUAJE C METODOLOGIA APCE

GUIA No. 2 PARA EL CURSO DE PROGRAMACION II (NIVEL INTERMEDIO)


Autor: Ing. JESS ENRIQUE DURN VILLAMIZAR
Master of Science in Engineering. Candidato a Magister en Educacin.

TEMA 1. EL CONCEPTO DE PUNTERO O APUNTADOR


1. CONCEPTOS BSICOS: TIPOS DE DATOS Y RESERVA DE MEMORIA
Dentro de la memoria del computador, cada dato almacenado ocupa una o ms celdas contiguas de
memoria (bytes adyacentes). El nmero de celdas de memoria requeridas para almacenar un dato
depende de su tipo. Por ejemplo, un carcter (char) ser normalmente almacenado en 1 byte (8 bits)
de memoria; un entero (int) usualmente necesita de 2 bytes contiguos. Un nmero en coma flotante
(float) puede necesitar cuatro bytes contiguos, y una cantidad de doble precisin puede requerir de 8
bytes contiguos. (Ver programa: Unidad_1_Tema_01).
// Programa para determinar la cantidad de bytes ocupada por cada tipo de dato
#include <stdio.h>
#include <conio.h>
main()
{
char a = 'A';
// los datos enteros ocupan 16 o 32 bits, dependiendo de la computadora a usar
// short int hace referencia a un dato entero de precision corta
short int numero1 = 19;
// long int hace referencia a un dato entero de precision larga
long int numero2 = 1234567891;
// short int hace referencia a un dato entero sin signo
unsigned int numero3 = 1234567891;
float x = 0.78;
double z = 6.02e+23;
int nBytes_char, nBytes_float, nBytes_double;
int nBytes_int1, nBytes_int2, nBytes_int3;
nBytes_char = sizeof(a);
nBytes_int1 = sizeof(numero1);
nBytes_int2 = sizeof(numero2);
nBytes_int3 = sizeof(numero3);
nBytes_float = sizeof(x);
nBytes_double = sizeof(z);
printf("\n Un valor tipo char, como '%c', requiere %d Bytes.\n", a, nBytes_char);
printf("\n Un valor tipo int, como %d, requiere %d Bytes.\n", numero1, nBytes_int1);
printf(" Un valor tipo int, como %d, requiere %d Bytes.\n", numero2, nBytes_int2);
printf(" Un valor tipo int, como %d, requiere %d Bytes.\n", numero3, nBytes_int3);
printf("\n Un valor tipo float, como %.2f, requiere %d Bytes.\n", x, nBytes_float);
printf("\n Un valor tipo double, como %g, requiere %d Bytes.\n", z, nBytes_double);
getch();
}
2. DECLARACIN DE VARIABLES Y POSICIONES (DIRECCIONES) DE MEMORIA

Siempre que declaramos una variable en C, el compilador AUTOMTICAMENTE ASIGNAR CELDAS DE


MEMORIA a ste dato.

Memoria de la computadora

main( )
{ Direccin de Memoria (&c) Valor
char c = A;
0028FF47 c A

Identificador

int b = 78; Direccin de Memoria (&b) Valor

... b 78
0028FF40

Identificador

Programa 2.
// Programa para imprimir datos declarados y sus posiciones de memoria
#include <stdio.h>
#include <conio.h>
main()
{
char a = 'A';
int b = 78;
printf("\n a = %c\n", a);
printf("\n La direccin de memoria (&a) de la variable a es %p\n", &a); // P : Memory address
printf("\n La direccin de memoria (&a) de la variable a es %x\n", &a); // Formato HEXADECIMAL
printf("\n\n b = %d\n", b);
printf("\n La Posicin de memoria (&a) de la variable b es %p\n", &b); // P : Memory address
printf(" La direccin de memoria (&a) de la variable b es %x\n", &b); // Formato HEXADECIMAL
getch();
}

variable) y por medio de su direccin de memoria. Para acceder a un valor de una variable valindonos de su
3. Concepto y declaracin de punteros
La variable c (del ejemplo anterior), qued en un lugar de memoria. Es evidente que si el programa
hace uso de esa direccin de memoria, puede llegar a ella. Esto se hace por medio de un tipo especial
de variable llamado: Puntero. Por lo tanto en la variable puntero vamos a almacenar la direccin
de memoria de la variable-.

Para definir un apuntador se requiere determinar inicialmente A QUE TIPO DE VARIABLE SE VA A


APUNTAR. Si a, es una variable tipo char, el puntero pa (puntero a la variable a), debe declararse
como un puntero que apuntar a una variable tipo char. De igual manera, Si b, es una variable tipo int,
el puntero pb (puntero a la variable b), debe declararse como un puntero que apuntar a una variable
tipo int. En lenguaje C, se declaran los punteros de la siguiente manera:

Tipo de dato al cual Nombre del


se va a Apuntar
* Puntero
;

Aplicado a nuestro ejemplo, seria: main( ) main( )


{ {
char c = A; char c, *pc;
char *pc; int b , *pb;
int b = 78; ...
int *pb; }
...
}

El hecho de declarar un apuntador NO IMPLICA que quede apuntando a alguna variable. Para que un
apuntador quede apuntando a alguna variable, es indispensable asignar al apuntador LA DIRECCION
DE LA VARIABLE a la que apunta, de la siguiente manera:

main() Identificador
{
char a; Direccin de Memoria (&a) Valor
char *pa; *pa
pa = &a; 0028FF47 a A
a = A;
... pa
} PUNTERO
// Programa 3. Programa que define punteros a variables
#include <stdio.h>
#include <conio.h>
main()
{
char a, *pa; // declaracion del puntero pa a un dato tipo char
int b, *pb; // declaracion del puntero pb a un dato tipo int
a = 'A';
b = 78;
pa = &a; // Se asigna la direccion de a al puntero pa
pb = &b; // Se asigna la direccion de b al puntero pb
printf("\n a = %c &a = %x pa = %x *pa = %c\n", a, &a, pa, *pa);
printf("\n\n b = %d &b = %x pb = %x *pb = %d\n", b, &b, pb, *pb);
getch();
}

Segn nuestro programa de ejemplo *pa y a REPRESENTAN EL MISMO DATO (el contenido de las celdas de
memoria). Igual, pasa con *pb y b (REPRESENTAN EL VALOR DE b).

En tanto que, pv y &b REPRESENTAN LA DIRECCION DE MEMORIA del dato b.

4. Operaciones con punteros


Operar con punteros equivale a operar con las propias variables a las cuales variables a las cuales
apuntan. Revisa el siguiente programa de ejemplo y saca tus propias conclusiones.

// Programa 4. Definicin de punteros a variables.


#include <stdio.h>
#include <conio.h>
main()
{
char a, *pa; // declaracion del puntero pa a un dato tipo char
int b, *pb; // declaracion del puntero pb a un dato tipo int

a = 'A';
b = 78;

pa = &a; // Se asigna la direccion de a al puntero pa


pb = &b; // Se asigna la direccion de b al puntero pb

printf("\n a = %c &a = %x pa = %x *pa = %c\n", a, &a, pa, *pa);


printf("\n\n b = %d &b = %x pb = %x *pb = %d\n", b, &b, pb, *pb);
getch();
}
// Programa 4. Operaciones con apuntadores
#include <stdio.h>
#include <conio.h>
main()
{
int x, *px;
int y, *py;
int z, *pz;
px = &x;
py = &y;
pz = &z;

x = 125;
y = 78;
// Operaciones con VARIABLES
z = x + y;
printf("\n OPERACIONES CON VARIABLES.\n");
printf("\n\n %d + %d = %d\n", x, y, z);
z++;
printf(" z++ : %d\n", z);
// Operaciones con PUNTEROS
printf("\n OPERACIONES CON PUNTEROS.\n");
*pz = *px + *py;
printf("\n\n %d + %d = %d\n", *px, *py, *pz);
(*pz)++;
printf(" (*pz)++ : %d\n", z);
// Miscelanea de Operaciones
*px = 0; // Linea 1
*px = *px + 3; // Linea 2
*px = *px * 4; // Linea 3
x = *px + 10; // Linea 4
x = (*px)++; // Linea 5
*px *= x * 2; // Linea 6
printf("\n\n Operaciones varias: x = %d *px = %d\n", x, *px);
getch();
}

Ejercicios de prctica.
1. Crea un programa para probar el efecto de las operaciones: (*px)++ y (px)++.
Escribe tus conclusiones.

2. Escribir un programa en C, para realizar sobre dos nmeros, la operacin de cociente entero
(obtener el residuo de la divisin), pero hazla con punteros.

3. Escribir un programa en C, para realizar sobre dos nmeros, la operacin de mdulo (obtener el
residuo de la divisin), pero hazla con punteros.

You might also like