Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Punteros
Claudio Gutirrez-Soto.
Punteros
Un puntero es una variable que hace referencia a una direccin
de memoria
Sintaxis:
Tipo_Dato *nombre_variable_puntero;
Ejemplo:
int *p;
Asignacin de Direccin
nombre_puntero=&variable;
Punteros
El carcter & delante de una variable indica que lo
se est accediendo es a la direccin de memoria
de dicha variable.
Ejemplo:
int *p;
p=0;
/* p posee la direccin NULL 0*/
p=NULL; /* p posee la direccin NULL 0*/
p=&i;
/*p apunta hacia i conteniendo la
direccin de i */
p=(int )1501; /*direccin absoluta de memoria */
Punteros
" Si p es un puntero, entonces *p es el valor
de la variable a la que apunta .
Ejemplo:
double x,y,*p;
p=&x;
y=*p;
Lo anterior es equivalente a :
y=*&x;
y=x;
Punteros
Inicializacin
Sintaxis:
tipo_dato *nombre_puntero=&variable;
Ejemplo:
int i=7,*p=&i;
Punteros
Construcciones a las que no se debe apuntar.
*No apuntar a constantes.
&3 /* ilicito*/
*No apuntar a arreglos, el nombre de un arreglo es una
constante
int a[77];
&a;
*No apuntar a expresiones ordinarias
&(k+99)
Punteros
*No apuntar a variables de tipo register.
register v;
&v;
*Si a es un arreglo, expresiones como:
&a[0] y a[i+j+3] adquieren sentido
Punteros
int i=3, j=5, k,*p=&i, q=&5,r;
double x=11.5;
Punteros
Punteros
Llamada por valor
Mx(a,b)
Int a,b;
{
return((a>b)?a:b);
}
Llamado por referencia
Mx(a,b,m_ptr)
Int a, b,*m_ptr;
{
*m_ptr=(a>b)?a:b;
}
Punteros
Relacin entre punteros y arreglos.
Un puntero es una variable cuyos valores son
direcciones. El nombre de un arreglo es una
direccin o puntero fijo. Cuando se declara un
arreglo, el compilador debe asignar una
direccin
base
y
la
cantidad
de
almacenamiento suficiente como para alojar a
todos los elementos del arreglo.
Punteros
#define TAM 100
int a[TAM], *p;
y el sistema hece que los bytes numerados 300,
304, 309,......696 sean las direcciones
de a[0], a[1], a[2],...,a[99].
p=a;
=
p=&a[0];
Punteros
Aritmtica de punteros
La aritmtica de puntero proporciona una opcin
para la indizacin de arreglos, las
proposiciones
p=a+1;
=
p=&a[1];
Sumar un arreglo:
suma=0;
for(p=a; p<&a[TAM];++p)
suma+=*p;
Punteros
suma=0;
for(i=0;i<TAM;++i)
suma+=*(a+i);
Debido a que a
es un puntero constante, las
expresiones como:
a=p;
++a;
a+=2;
Son ilcitas, no se puede cambiar la direccin de a.
Expresiones apuntadoras como p+1, ++p y p+=i son
vlidas.
Double a[ ];
=
double*a;
Punteros
Cadenas
Las cadenas son arreglos unidimensionales de tipo char, Por convencin, una
cadena en C se termina con centinela de fin de cadena carcter nulo \0.
char s[ ]="ABC"
char *p="a es por anon o pastel alfabeto"
void main()
{
char *q="del cual todos tienen parte";
printf("\n%s,%s\n %s",s,p,q);
ABC: a es por anon o pastel alfabeto del cual todos tienen parte.
For(p=q;*q!='\0';++q)
*q+=1
printf("\n %s\n\n",p);
}
Punteros
Arreglos multidimensionales
Expresiones equivalentes ab[i][i]
*(b[i]+j)
(*(b+i))[j]
*((*(b+i))+J)
(&b[0][0]+5i+j)
Al definir la funcin, en el encabezamiento, la declaracin:
Int (*v)[5];
=
int v[ ][5];
Int c[7][9][2];
C[i][j][k]
=
(&c[0][0][0]+9*2+i+2*j+k)
Estructuras y punteros
Podemos acceder a la direccin de una
variable estructura de la misma manera
que cualquier otra direccin, mediante el
uso del operador (&). As podemos
escribir:
tipo *ptvar;
Estructuras y punteros
Ejemplo:
typedef struct{
int no_cuenta;
char tipo_cuenta;
char nombre[80];
float saldo;
}cuenta;
cuenta cliente, *pc;
Estructuras y punteros
En este ejemplo cliente es una variable
estructura de tipo cuenta y pc un puntero que
apunta a una variable de tipo cuenta.
Por ende
pc=&cliente;
As podemos acceder a un miembro individual de
una estructura en trminos de su
correspondiente variable puntero escribiendo
Ptvar->miembro
Lo que es equivalente a escribir
variable.miembro
Estructuras y punteros
El operador -> puede combinarse con el
operador punto para acceder a un
submiembro dentro de una estructura. Por
lo tanto, un submiembro puede ser
accedido escribiendo
ptvar->miembro.submiembro
Estructuras y punteros
typedef struct{
int mes;
int dia;
int anio;
}fecha;
struct Cuenta{
int no_cuenta;
char tipo_cuenta;
char nombre[80];
float saldo;
fecha ultimopago;
}cliente,*pc=&cliente;
cliente.no_cuenta, pc->no_cuenta,
(*pc).no_cuenta
Estructuras y punteros
typedef struct{
int mes;
int dia;
int anio;
}fecha;
struct Cuenta{
int no_cuenta;
char tipo_cuenta;
char nombre[80];
float saldo;
fecha ultimopago;
}cliente,*pc=&cliente;
cliente.ultimopago.mes,
>ultimopago.mes,
(*pc).ultimopago.mes
pc-
Estructuras y punteros
typedef struct{
int mes;
int dia;
int anio;
}fecha;
struct Cuenta{
int no_cuenta;
char tipo_cuenta;
char nombre[80];
float saldo;
fecha ultimopago;
}cliente,*pc=&cliente;
Para acceder al tercer carcter del nombre, este puede ser accedido de la
siguiente manera:
cliente.nombre[2]
pc->nombre[2]
(*pc).nombre[2]
Ejemplo
main(){
int n=3333;
char t=A;
float b=99.99;
typedef struct{
int mes;
int dia;
int anio;
}fecha;
struct Cuenta{
int *no_cuenta;
char *tipo_cuenta;
char *nombre;
float *saldo;
fecha ultimopago;
}cliente,*pc=&cliente;
cliente.no_cuenta=&n;
cliente.tipo_cuenta=&t;
cliente.nombre=Lzaro;
cliente.saldo=&b;
printf(%d
%c
%s
%.2f,*cliente.no_cuenta,*cliente.tipo_cuenta,
cliente.nombre,*cliente.saldo);
printf(%d
%c
%s
%.2f
\n,*pc->no_cuenta,*pc>tipo_cuenta, pc->nombre,*pc->saldo);
}
3333 A Lzaro 99.99
3333 A Lzaro 99.99
Preguntas?