Punteros Base
Punteros Base
Punteros Base
PUNTEROS
OBJETIVOS
Datos de entrada(ingresados x
teclado) Procesamiento:
Calcular salarios
¿Cómo representar los datos?
Los seres humanos:
Usamos lenguaje natural o símbolos
Ejemplo:
Para representar números, usamos el sistema decimal
Para representar palabras, usamos el abecedario
Las maquinas de computo:
EN
Usa conjuntos de unos y ceros 01010101010111000 SERIO!!!
El dato mas pequeño en el computador es
Un 1 o un 0 -> bit
El conjunto de 8 bits -> 1 byte
TIPOS DE DATOS
Los datos se clasifican en TIPOS
Son los diferentes dominios existentes. Ejemplo:
Edad, Año de Nacimiento, Numero de multas
Tienen dominio numérico
Nombre, Dirección, Lugar de nacimineto,
Caen en el dominio de la información tipo texto
Modificación de un elemento
A[3] = 2; //Almaceno un valor en el elemento 3 de A
for(i = 0; i < 100; i++)
A[i] = 0;
REPRESENTACION INTERNA
Cuantos bytes ocupa un tipo de dato o variable? 1000 Lista[0]
En C++ lo indica el operador sizeof
Ejemplo:
1008 Lista[1]
int a;
printf(“%d %d”, sizeof(int), sizeof(a));
1016 Lista[2]
El computador internamente
No almacena la dirección de todos los elementos del
arreglo 1024 Lista[3]
Solo almacena la dirección del primer elemento
Lista[4]
El resto lo calcula así: 1032
Cuando se
libera para
una
int *a; variable
a = malloc...;
…
free(a);
ARITMETICA DE PUNTEROS
Los operadores + y –
Se pueden usar con punteros
Pero el significado de la operación cambia un poco
Si un entero ocupa 4 bytes, tomemos este ejemplo
int x; La suma indica que p se mueva 2
“enteros” mas adelante
int *p; Cada entero equivale a 4 bytes
p = &x; 100 + 2*4 = 108
En el cuerpo de la función
float CalcPromedio(float A[], int size){
…..
A[i] = 3;
}
int A[3][3];
(0,0) (0,1) (0,2) A[0] A[0][0] A[0]1] A[0][2]
#include <stdio.h>
#include <conio.h>
printf("\n");
main(){
printf("\ningrese otro caracter: ");
char p1,p2,p3=65;
scanf("%c",&p2);
printf("\ningrese un caracter: ");
printf("%c",p2);
p1 = getchar();
printf("\ningrese otro caracter: ");
putchar(p1);
p2 = getch();
printf("\n");
printf("caracter leido: %c",p2);
printf("\nel caracteer p3 es:");
getch();
putchar(p3);
}
Uso de fflush
Se requiere borrar el buffer para leer correctamente
#include <stdio.h>
#include <conio.h>
printf("\ningrese otro caracter: ");
main(){
scanf("%c",&p2);
char p1,p2,p3=65;
printf("%c",p2);
printf("\ningrese un caracter: ");
printf("\ningrese otro caracter: ");
p1 = getchar();
fflush(stdin);
putchar(p1);
p2 = getch();
printf("\n");
fflush(stdin);
fflush(stdin);
printf("caracter leido: %c",p2);
printf("\nel caracteer p3 es:");
getch();
putchar(p3);
}
printf("\n");
Apuntadores
Una variable de tipo apuntador contiene una dirección de memoria.
La dirección de memoria señalada por el apuntador es la que contiene el
dato que puede ser de cualquier tipo, incluso void.
entero
Asigna la dirección de entero a
pentero 548
int entero, *pentero;
pentero entero
entero = 548;
pentero = &entero; 548
*pentero = -234;
pentero entero
NOTA: a los apuntadores solo
puede asignárseles: 0, NULL o -234
una dirección
Ejemplo
#include <stdio.h>
#include <conio.h>
main(){
int entero,*pentero;
entero = 548;
pentero = &entero;
printf("La dirección de entero es %d\n",&entero);
printf("el valor de pentero es %d\n",pentero);
printf("el valor de entero es %d\n",entero);
printf("el valor de *pentero es %d\n",*pentero);
*pentero = -234;
printf("el valor de entero es %d\n",entero);
printf("el valor de *pentero es %d\n",*pentero);
getch();
}
Aritmética de apuntadores
Los apuntadores pueden utilizarse para acceder a los elementos de un arreglo.
#include <stdio.h>
#include <conio.h>
main(){
int a[10]={3,4,1,8,2,3,4,5,7,0},*b;
b = a;//b apunta al inicio del arreglo a
printf("dirección de b es %d, el contenido es %d\n",b,*b);
b = b + 1;//b apunta a a[1]
printf("dirección de b es %d, el contenido es %d\n",b,*b);
b = b + 3;//b apunta a a[4]
printf("dirección de b es %d, el contenido es %d\n",b,*b);
b = b - 2;//b apunta a a[2]
printf("dirección de b es %d, el contenido es %d\n",b,*b);
getch();
}
#include <stdio.h>
#include <conio.h>
main(){
double a[10]={3,4,1,8,2,3,4,5,7,0},*b;
b = a;//b apunta al inicio del arreglo a
printf("dirección de b es %d, el contenido es %lf\n",b,*b);
b = b + 1;//b apunta a a[1]
printf("dirección de b es %d, el contenido es %lf\n",b,*b);
b = b + 3;//b apunta a a[4]
printf("dirección de b es %d, el contenido es %lf\n",b,*b);
b = b - 2;//b apunta a a[2]
printf("dirección de b es %d, el contenido es %lf\n",b,*b);
getch();
}
Apuntadores y subíndices
La aritmética de apuntadores y los subíndices son equivalentes.
#include <stdio.h>
#include <conio.h>
main(){
double a[10]={3,4,1,8,2,3,4,5,7,0},*b;
int i;
b = a;//b apunta al inicio del arreglo a
for(i=0;i<10;i++)
printf("a[%d]=%lf\n",i,a[i]);
for(i=0;i<10;i++)
printf("*(b+%d)=%lf\n",i,*(b+i));
getch();
}
Apuntadores a funciones
Las funciones se comportan como apuntadores.
El nombre de la función es un apuntador al inicio del código de la función.
Las funciones pueden pasarse como parámetros a otras funciones.
Ejemplo de apuntador a función
#include <stdio.h>
#include <conio.h>
#include <math.h>
main(){
tabula(0,3.1416/2,sin);
tabula(0,3.1416/2,cos);
getch();
}
Salida de apuntador a
funciónf(0.000000) = 0.000000
f(9.000000) = 0.156435
f(18.000000) = 0.309018
f(27.000000) = 0.453991
f(36.000000) = 0.587786
f(45.000000) = 0.707108
f(54.000000) = 0.809018
f(63.000000) = 0.891008
f(72.000000) = 0.951057
f(81.000000) = 0.987689
f(0.000000) = 1.000000
f(9.000000) = 0.987688
f(18.000000) = 0.951056
f(27.000000) = 0.891006
f(36.000000) = 0.809016
f(45.000000) = 0.707105
f(54.000000) = 0.587783
f(63.000000) = 0.453988
f(72.000000) = 0.309014
f(81.000000) = 0.156431
¿Que valores tienen las
variables?
int x. *px:
x *px y *py
float y, *py;
x = 5;
px = &x;
*px = 2*x + *px;
y = x;
py = &y;
y = *py + x;
cout<<" final *px = "<<*px <<" x = " <<x<<"\n";
cout<<" final *py = "<<*py <<" y = "<<y<<"\n";
Preguntas
UNIONES
Permite que una variable se interprete de varias formas distintas,
dependiendo de la necesidad
En una estructura
Siempre es válido referirse a cualquier miembro de la misma
Si hay n miembros, hay n cajones de memoria
En una unión
Solo trabajaremos con un miembro a la vez
Hay un solo cajón de memoria, capaz de almacenar al mas grande de los
miembros
Si el elemento escogido es mas pequeño, sobrara espacio
UNIONES
typedef enum {Entero, Real} Tdato;