Sie sind auf Seite 1von 15

APUNTADORES

PROGRAMACIN EN C

Apuntadores
Es una variable que contiene la direccin de
memoria de otra variable.

Se puede apuntar a cualquier tipo de


variable.
El operador unario & devuelve la direccin
de memoria de la variable a la que apunta.
El operador de referencia * devuelve el
contenido de la variable a la que apunta.

El nombre de un arreglo es siempre un


apuntador a la direccin del primer elemento
de un arreglo.

Hecho por Huicho :)

Errores comunes en apuntadores


No asignar una direccin de memoria valida al apuntador antes de
usarlo. Ejemplo:
INCORRECTO

CORRECTO

Int *x;

Int *x=NULL;
Int y;
x = &y;
*x = 100;

*x = 100;

No inicializar el apuntador en NULL:


int *apuntador=NULL;
Hecho por Huicho :)

PROCESO
4

int dato= 2;

variables

int *apunt;

dato

Direcc
memoria
100

apunt

2000

apunt= &dato;

Hecho por Huicho :)

variables

Memoria
fsica

Memoria
fsica

Direcc
memoria

dato

100

apunt

100

2000

PROCESO
5

*apunt= 5;
variables

Hecho por Huicho :)

Memoria
fsica

Direcc
memoria

dato

100

apunt

100

2000

PROCESO 2
int x=1;

int y=2;
int *apuntador;
apuntador = &x;

y = *apuntador;
x = apuntador;
*apuntador = 3;
Hecho por Huicho :)

Aritmtica de apuntadores
Si p es un apuntador
a un tipo de dato al
*ap
sumar 1 obtendr la
*(ap+1)
siguiente direccin
*(ap+2)
de memoria de la
*(ap+3)
variable
*(ap+4)

VARIABLES

Memoria
fsica

arreglo[0]

100

arreglo[1]

101

arreglo[2]

102

arreglo[3]
arreglo[4]

103

104

Direcc
memoria

*(p + 1)
*(p + i)
*(p ++)

*(p += i)

Hecho por Huicho :)

int arreglo[5]= {1,2,3,4,5};


int *ap=NULL;
ap= arreglo;

Memoria dinmica
Se usa cuando se sabe exactamente cunta memoria se usar durante la
ejecucin y as no desperdiciarla pidiendo espacio innecesario en un
arreglo esttico.
Se emplea con apuntadores para reservar el espacio en tiempo de la
ejecucin.
Pueden pedirse arreglos unidimensionales o matrices.

Puede liberarse la memoria despus de usarla an cuando no haya


finalizado el programa.

Hecho por Huicho :)

Malloc
Pedirla a

<stdlib.h>

Prototipo: void * malloc(tamao en bytes)

Para saber el tamao en bytes de un tipo de


dato:
sizeof(double);

Se puede convertir el puntero void al tipo de


dato usado a travs de un casting:
int *apuntador;
apuntador= (int *)malloc(10*sizeof(int))
Si no hay memoria suficiente el apuntador
devuelve NULL
Hecho por Huicho :)

10

Calloc
Pedirla a

<stdlib.h>

Hace lo mismo q malloc pero inicializa en 0 los elementos


Prototipo:

void * calloc(num elementos,tamao en bytes)

Para saber el tamao en bytes de un tipo de dato:

sizeof(double);
Se puede convertir el puntero void al tipo de dato usado a
travs de un casting:

int *apuntador;
apuntador= (int *)calloc(10,sizeof(int))
Si no hay memoria suficiente el apuntador devuelve NULL
Hecho por Huicho :)

11

Diferencias Malloc vs Calloc


Malloc

Calloc

Hecho por Huicho :)

12

Aritmtica de apuntadores
Lectura
Recorrer arreglo con ciclo for conociendo el inicio, condicin e
incremento/decremento.

for(i=0; i<numeroelem; i++)


{
printf("\n\tDame el elemento[%d]: ",i);

scanf("%d", (apuntador+i));
}
Arreglo dinmico
int *apuntador;
apuntador= (int *)malloc(10*sizeof(int))
Hecho por Huicho :)

Arreglo esttico
int arreglo[5];
int *apuntador=NULL;
apuntador= arreglo;

13

Aritmtica de apuntadores
Impresin
Recorrer arreglo con ciclo for conociendo el inicio, condicin e
incremento/decremento.

for(i=0; i<numeroelem; i++)


{
printf("\n\tElemento[%d]: %d",i, *(apuntador+i));

Arreglo dinmico
int *apuntador;
apuntador= (int *)malloc(10*sizeof(int))
Hecho por Huicho :)

Arreglo esttico
int arreglo[5];
int *apuntador=NULL;
apuntador= arreglo;

Pasar de esttico a dinmico

14

char nombre[10];

apuntador = (char *)malloc(longi+1*sizeof(char));


Memoria
fsica

VARIABLES

Memoria
fsica

nombre[0]

apuntador[0]

nombre[1]

apuntador[1]

nombre[2]

apuntador[2]

nombre[3]
nombre[4]

\0

nombre[5]

Basura

nombre[6]

Basura

nombre[7]

Basura

apuntador[3]
Sumar 1 a longi para apuntador[4]
guardar tambin el
carcter de
terminacin

nombre[8]

Basura

nombre[9]

basura

Hecho por Huicho :)

VARIABLES

longi= strlen(nombre)

Despus de reservar el espacio,


cmo se copia de un arreglo al otro?

\0

15

Matrices
Apuntador de apuntadores
Se declara el apuntador de apuntadores y variables

int **matriz;

Int renglones, columnas, i;


Conociendo el nmero de renglones y columnas se recorre la matriz
Se crean los espacios de las columnas para cada rengln.

matriz = (int **)malloc(renglones*sizeof(int*));


for(i=0; i<renglones; i++)
{

matriz[i]= (int *)malloc(columnas*sizeof(int));


}
Hecho por Huicho :)

Das könnte Ihnen auch gefallen