Sei sulla pagina 1di 33

Diseo de algoritmos

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)

Asignacin dinmica de memoria

Cuando definimos un arreglo con un


tamao definido, podemos tener dos
posibles
casos,
uno
es
un
desaprovechamiento de la memoria y otro
es la falta de espacio, lo cual en general
no sucede.

Asignacin dinmica de memoria


Por ende, podra ser posible definir:
int *x;
En lugar de
int x[10];
No obstante, si no conocemos el tamao
de manera predeterminada, es posible
asignar espacio de manera dinmica.

Asignacin dinmica de memoria


As para asignar memoria de manera
dinmica podemos utilizar la funcin
malloc, como sigue:
x= (int *)malloc(10*sizeof(int));
Esta funcin reserva un bloque de
memoria cuyo tamao (en bytes) es
equivalente a 10 cantidades enteras.

Asignacin dinmica de memoria


En general el <<cast>> de tipo que
procede a malloc debe ser consistente
con el tipo de datos de la variable puntero.
As si quisiramos pedir en tiempo de
ejecucin para una variable tipo double
sera:
y=(double *)malloc(10*sizeof(double));

Asignacin dinmica de memoria


int i,n,*x;
.
printf(Cuntos nmeros sern ingresados\);
scanf(%d,&n);
/* reserva de memoria para n */
x=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++){
printf( i=%d x=, i+1);
scanf(%d,x+i);
}

Uso de typedef en estructuras


Recordemos que la palabra reservada
typedef nos permite redefinir un tipo de
dato, por ejemplo:
typedef int entero;
Es posible definir tipos de datos con la
nueva definicin
entero a,b,c;

Uso de typedef en estructuras


Por ello, en trminos generales se puede definir.
typedef struct{
miembro 1;
miembro 2;
miembro 3;
.
}nuevo-tipo;

Uso de typedef en estructuras


typedef struct{
int mes;
int dia;
int anho;
}fecha;
fecha Aux;

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?

Potrebbero piacerti anche