Está en la página 1de 30

Punteros

Las variables de tipo puntero representan direcciones


donde almacenar valores. Es importante diferenciar
entre puntero (espacio de memoria donde se
almacena la direccin) y la propia direccin apuntada
por el puntero (su valor).
Se declaran con un asterisco delante del identificador
de la variable:
int *px,y; /* px es un puntero a entero e y un entero */

Programacin en C 1
Punteros

Los gestin de punteros admite dos operadores


bsicos:
Si px es un puntero (direccin): *px es el contenido
del puntero (el valor almacenado en la direccin).

Si x es una variable: &x es la direccin de memoria


donde est almacenada la variable.

Programacin en C 2
Punteros

int main() Direccin Contenido Grfica


px
{ px-> 35: ? ? ? ? ?
y
0 0 0 3
y -> 39: 3
int *px,y=3;

px
px=&y; px-> 35: 0 0 0 39 39
0 0 0 3 y
/* px apunta a y */ y -> 39: 3

px
*px=5; px-> 35: 0 0 0 39 39
0 0 0 5 y
/* y vale 5 */ y -> 39: 5

Programacin en C 3
1 int *punt;
int x=7;
int y=5;
punt=&x;
*punt=4;
printf(%d, %d,x,y); // qu imprime este printf?

2 int *punt;
int x=7;
int y=5;
punt=&x;
x=4;
printf(%d, %d,*punt,y); // qu imprime este printf?
3 int *punt;
int x=7;
int y=5;
punt=&x;
x=4;
punt=&y;
printf(%d, %d,*punt,x); // qu imprime este printf?
Programacin en C 4
4 int *punt;
int x=7;
int y=5;
punt=&x;
*punt=3;
punt=&y;
*punt=x;
x=9;
printf(%d, %d,*punt,x); // qu imprime este printf?

5 int *punta, *puntb;


int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
printf(%d, %d,*puntb,x); // qu imprime este
printf?
Programacin en C 5
6 int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
printf(%d, %d,*puntb, *punta); // qu imprime?
7 int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
puntb=punta;
printf(%d, %d,*puntb, y); // qu imprime?
Programacin en C 6
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 7
Arrays
La definicin de una variable de tipo array (vector) se
realiza indicando la dimensin entre corchetes:
int a[100]; /* Un vector de 100 enteros */
float vx[4][4]; /* Matriz de 4x4 reales */
int *pt[10][10][10][10]; /* Una matriz de 4 dimensiones
de punteros a enteros */
Asimismo, pueden inicializarse:
float a[3]={2.45, -1.34, 2.11};
int vx[2][3]={{3,5,1},{2,1,2}};

Programacin en C 8
Indexacin de arrays

A diferencia de otros lenguajes los arrays en C comienzan


por el elemento 0 y terminan en el n-1.
int a[6];
a[0]=23;
a[2]=a[0]+5;
for(i=0;i<6;i++)
printf(%d,a[i]);

a 23 28
a[0] a[1] a[2] a[3] a[4] a[5]

Programacin en C 9
Ejemplo Array

Programacin en C 10
Strings (cadenas)
Los strings son los arrays de caracteres de una dimensin.
Son las cadenas de caracteres.
Definicin:
char x[20],n[50]=Chema;
/*equivalente a char n[50]={C,h,e,m,a,\0}*/

n C h e m a \0
n[0] n[1] n[2] n[3] n[4] n[5]
Carcter
nulo
Programacin en C 11
Asignacin de Strings

La asignacin de strings por medio del operador (=) slo


es posible en la declaracin.
Ejemplo:
char n[50]=Chema; /* Correcto */
n=Otro nombre; /* Error: no es
declaracin */
Para las operaciones sobre strings se utilizan diferentes
funciones de librera. Por ejemplo, strlen() calcula el
tamao del string (nmero de caracteres).

Programacin en C 12
Ejemplo Cadena

Programacin en C 13
Ejemplo Cadena2

Programacin en C 14
Ejemplo Cadena3

Ojo! No hemos puesto el operador & delante de cadena! Es un error? No. Con las cadenas
no hay que poner el carcter & del identificador al usar scanf . Por que? Porque scanf espera
una direccin de memoria y el identificador, por la dualidad vector-puntero, es una direccin
de memoria!
Programacin en C 15
Lectura con gets

Programacin en C 16
Lectura con gets

La funcin gets lee todos los caracteres que hay hasta encontrar un salto de linea.

Programacin en C 17
Copia de cadenas

Programacin en C 18
Copia de cadenas (mejorada)

Programacin en C 19
Copia de cadenas (usando funciones)

Realizar un programa que lea una cadena de maysculas y minsculas, para


luego convertirlas todas en maysculas

Programacin en C 20
Arrays y punteros

El identificador de una variable array tiene el valor de la


direccin de comienzo del mismo. Por lo tanto, su valor
puede usarse como un puntero.
int *pb,*pc;
a 10 20 30 40 50
int a[5]={10,20,30,40,50}; pb pc
pb=a; a 11 20 30 40 50
*pb=11; pc
pb
pc=&a[3];
a 11 20 30 44 50
*pc=44; pc
pb

Programacin en C 21
Arrays y punteros
El nombre de un array es la direccin del primer elemento del array. Esto se
expresa mediante las siguiente frmula:
X[ i ]=*(X +i)

Ejemplos:
int miarray[7];
int *punt;
punt=&miarray[0]; // idem que punt=miarray;
*punt=5; //idem que punt[0]=5;
(*punt+2)=5; //idem que punt[2]=5;

int *punt,i;
int x[5]={1,2,3,4,5};
punt=x;
*punt=9;
for(i=0;i<5;i++)
printf(%d,,x[i]); // qu imprime?
Programacin en C 22
Ejemplos:
int *punt,i;
int x[5]={1,2,3,4,5};
punt=&x[0];
*punt=9;
punt[3]=7;
for(i=0;i<5;i++)
printf(%d,,x[i]); // qu imprime?

int *punt,i;
int x[5]={1,2,3,4,5};
punt=x;
*x=11;
*(punt+3)=9 ;
for(i=0;i<5;i++)
printf(%d,,x[i]); // qu imprime?

Programacin en C 23
Ejemplos:
int *punt,i;
int x[5]={1,2,3,4,5};
punt=x;
*(punt+2)=9;
*(x+3)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
printf(%d,,*(punt+i)); // qu imprime?

int *punt,i;
int x[5]={1,2,3,4,5};
punt=x+4;
*(punt-2)=9;
punt--;
*(punt)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
printf(%d,,*(x+i)); // qu imprime?
Programacin en C 24
Ejemplos:

int *punt,i;
int x[5]={1,2,3,4,5};
punt=&x[0]+3;
*(punt-2)=9;
punt--;
*(punt)=7 ;
punt[1]=11 ;
punt=x;
for(i=0;i<5;i++)
printf(%d,,punt[i])); // qu imprime?

Programacin en C 25
Arrays y punteros

Los arrays de varias dimensiones s se diferencian de los


punteros mltiples:

Matriz de 2 dimensiones: Puntero mltiple:


int mx[3][3]; int **pm;
mx pm
0,0 0,1 0,2
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2

pm=mx; /* ERROR */ 2,0 2,1 2,2 1,0 1,1 1,2


pm[0]=mx[1]; /* OK */
Pm[0][1]=mx[1][2] /* OK */
Programacin en C 26
Argumentos de tipo array

Cuando un array se pasa como argumento a una


funcin, la ltima de las dimensiones no se define.
Ejemplo:
int vec[12],mat[4][4];
calcula(vec,mat);

void calcula(int v[], int m[4][])


{
...
}

Programacin en C 27
scanf()

El formato de llamada de scanf()es:


scanf(format, dir1, dir2, dir3,..., dirn);

donde:
format : Es el string de formato de entrada de los datos.
diri : Es la direccin donde se almacena el resultado.

Programacin en C 28
scanf()

Ejemplo
int a,*pa;
float x;
char c;

scanf(%d,&a); /* Lee un entero y lo


almacena en a */
scanf(%f %c,&x,&c); /* Lee x y c */
scanf(%d,pa); /* PELIGROSO */
pa=&a; scanf(%d,pa); /* OK. Lee a */

Programacin en C 29
scanf() Lectura de strings

Ejemplo:
char *pc;
char str[82];

scanf(%s,pc); /* PELIGROSO */

scanf(%s,str); /* Lee hasta un blanco o


fin de lnea */

scanf(%[^\n],str); /* Lee toda la lnea */

Programacin en C 30

También podría gustarte