Documente Academic
Documente Profesional
Documente Cultură
MAXIMA: Sin
punteros no hay
paraso
Lenguaje C
SCRIPT II
Punteros
en C
Lenguaje C
Script II Punteros en C
REPASANDO LAS
VARIABLES
int
Como ya sabemos, las variables en
el lenguaje C tienen 5 elementos 32 bits
que debemos tener presente: edad
1. Nombre de la Variable 10
2.Tipo de Dato
3.Tamao
4.Valor
5.Direccin de Memoria 0xf0113b1
Para comprender el uso de
punteros es indispensable conocer
el uso de las variables. Un error
muy comn es desconocer la
relacin entre estos elementos y
Lenguaje C
REPASANDO LAS
VARIABLES
int
Para empezar a utilizar punteros en
C, debemos prestar especial 32 bits
atencin a las direcciones de
memoria.
edad
10
Aunque parezca mentira, y a pesar
de que casi no las miramos, las
direcciones de memoria son la
clave para entender las bases del 0xf0113b1
uso de punteros. Saber usar una
direccin de memoria y el valor de
una direccin de memoria es el
quebradero de cabeza mas comn
en miles de programadores en todo
el mundo.
Lenguaje C
USANDO VARIABLES
Cmo acceder a los elementos de
una variable?
USANDO VARIABLES
Cmo saber el tamao de una
variable?
int edad;
sizeof(edad);
sizeof(unsigned int);
Tipos bsicos de datos
Las variables tipo char se usan para almacenar caracteres ASCII como A,1,&,
etc.
Cuando se desea trabajar con enteros, dependiendo del rango, se puede usar short, int
o long, con signo o sin signo.
Para trabajar con enteros sin signo, se debe anteponer la palabra reservada unsigned
delante del tipo (unsigned int). Esto nos permite aumentar el rango del tipo.
Por defecto son con signo, no hace falta anteponer la palabra signed.
Tipos de variables
Programacin en C 10
Lenguaje C
USANDO VARIABLES
Cmo ver o alterar el valor de una
variable?
Es broma !
Simplemente hacemos referencia a ella
int por su nombre en cualquier asignacin o
funcin
32 bits
edad
10
Lenguaje C
USANDO VARIABLES
Cmo saber la direccin de memoria
de una variable?
32 bits
edad
10
0x7fff2960d0ac
ATENCION !
Las direcciones de
memoria cambian con
cada ejecucin
ESPECIFICADORES DE FORMATO PARA SCANF
Y PRINTF
SECUENCIAS DE ESCAPE EN C
Cuando estamos escribiendo un programa puede que necesitemos representar la informacin de una forma
especial, con ciertas alineaciones, tabulaciones o estilos, en C es posible realizar estas tareas mediante las
llamadas secuencias de escape.
Lenguaje C
&
int
*
10 edad
& 0x7fff2960d0ac
La direccin de memoria se
puede obtener al usar el
operador & en cualquier
variable
El operador de indireccin
(*) es aplicado a
direcciones de memoria y
permite acceder al valor
almacenado en ella
VALGAN VERDADES
1
0
A nadie en su sano juicio se le ocurrir utilizar una direccin de memoria
dentro del cdigo fuente. Ni que decir de la sentencia *&edad. Para que
alguien tendra que utilizar esta extraa sintaxis cuando simplemente
puede usar la variable con su simple nombre?.
QUE ES UN
PUNTERO
Recuerdan que nadie en su sano juicio usara la sentencia as:
*0x7f5f0ac?
0x503fb43 0x7f5f0ac
Lenguaje C
Punteros
Un puntero es un objeto que apunta a otro objeto. Es decir,
una variable cuyo valor es la direccin de memoria de otra
variable.
Las direcciones de memoria dependen de la arquitectura
del ordenador y de la gestin que el sistema operativo haga
de ella.
21
Lenguaje C
QUE ES UN
Examinando un Puntero
PUNTERO
Un puntero es una variable, y como tal,
int* tiene todos los elementos de cualquier
variable (tipo de dato, nombre, tamao
y direccin de memoria) . La nica
64 bits
diferencia visible es que al declararla,
ptr su tipo de dato debe ir acompaado del
0x7f5f0ac smbolo *
QUE ES UN
Declaracin de un puntero
PUNTERO
En mi humilde opinin, la confusin de
int* muchos programadores se debe a que
el smbolo * se usa para diferentes
cosas, entre ellas para declarar un
64 bits
puntero.
ptr
0x7f5f0ac int *ptr = &edad;
*ptr = 19;
QUE ES UN
Declaracin de un puntero
PUNTERO
A pesar que la gran mayora utiliza la
int* declaracin del modo int *ptr como la
normal, usar la siguiente declaracin
ayuda a evitar confundirla con la
64 bits
indireccin:
ptr
0x7f5f0ac int* ptr = &edad;
*ptr = 19;
QUE ES UN
DEMOSTRADO
PUNTERO
Un puntero guarda direcciones de
memoria. As mismo un puntero al ser
una variable, tiene su propia direccin
de memoria
Programacin en C 26
Punteros
Direccin Contenido Grfica
int main() px
px-> 35: ? ? ? ? ?
0 0 0 3 y
{ y -> 39: 3
int *px,y=3;
px
px-> 35: 0 0 0 39 39
px=&y; y -> 39: 0 0 0 3 y
3
/* px apunta a y */
px
px-> 35: 0 0 0 39 39
*px=5; y -> 39: 0 0 0 5 y
5
/* y vale 5 */
}
Programacin en C 27
Punteros
La declaracin de punteros genricos a
direcciones se asocian al tipo void.
Declarar una variable (que no sea un puntero)
de tipo void no tiene sentido.
Ejemplo:
void *px,v; /* La variable v
est mal
declarada */
Programacin en C 28
Lenguaje C
PUNTERO
ENDEMONIADO
Por qu los punteros tienen fama
de ser complicados?
int*
La desventaja de los punteros es que
debemos ser muy disciplinados en su
uso y no es tarea fcil. Entre los errores
64 bits
mas comunes tenemos ptr
0x7f5f0ac
Punteros no inicializados
Asignacin de punteros errnea
Punteros con tipos distintos
0x503fb43
Indireccin errnea
Uso incorrecto de punteros nulos
PUNTERO
ENDEMONIADO
Punteros no inicializados
PUNTERO
ENDEMONIADO
Violacin de Segmento
La Violacin de Segmento se
produce porque un programa intenta
modificar o acceder a un segmento de
memoria que no le corresponde. El
Sistema Operativo al detectar esta
intrusin se protege y detiene el
programa agresor indicando que ha
violado un segmento que no le
corresponde.
Lenguaje C
PUNTERO
ENDEMONIADO
Inicializacin de puntero errnea
PUNTERO
ENDEMONIADO
Punteros con tipos de datos
distintos
PUNTERO
ENDEMONIADO
Indireccin errnea
La indireccin en si misma no es un
error. El error viene al usarla en un
contexto errneo.
PUNTERO
ENDEMONIADO
Uso incorrecto de punteros nulos
ASIGNACION DE
PUNTEROS
La clave en el uso de todo puntero es
su correcta asignacin (inicializacin).
int*
La asignacin de punteros es una
operacin que permite indicar que
direccin de memoria tomar un
64 bits
puntero determinado. ptr
0x7f5f0ac
Hay 2 tipos de asignacin de punteros
ASIGNACION DE
PUNTEROS
Asignacin de variable a puntero
ASIGNACION DE
PUNTEROS
Asignacin de puntero a puntero
*pb=11; a 1120304450
pc=&a[3]; pb pc
*pc=44;
Programacin en C 48
RECORRIDO DE UN VECTOR UTILIZANDO
NDICES Y PUNTEROS
#include <stdio.h>
main()
{
int v[10];
int i, *p;
for (i=0; i < 10; i++) v[i] = i;
for (i=0; i < 10; i++) printf ("\n%d", v[i]);
p = v;
for (i=0; i < 10; i++) printf ("\n%d", *p++);
/* Tras cada p++ el puntero seala a la siguiente posicin en v
*/
return 0;
}
Punteros y vectores
Una de las aplicaciones ms frecuentes de los punteros es el
manejo de vectores y cadenas de caracteres.
Como todos los elementos de un vector se almacenan en posiciones
consecutivas de memoria, basta conocer la posicin de memoria del
primer elemento para poder recorrer todo el vector con un puntero.