Está en la página 1de 55

Punteros

Punteros a ….



Ejemplos
Ejemplo
Ejemplo

El valor es ahora: 45
Operaciones con Punteros
pt1++ puntero Desplazamiento ascendente de 1 elemento

pt1-- puntero Desplazamiento descendente de 1 elemento

pt1 + n puntero Desplazamiento ascendente n elementos

pt1 - n puntero Desplazamiento descendente n elementos

pt1 - pt2 entero Distancia entre elementos

pt1 == booleano Siempre se puede comprobar la igualdad o desigualdad


NULL con NULL

pt1 = pt2 puntero Asignación

pt1 = void puntero Asignación


genérico
Ejemplos
ip+10; Si *ip == &m[j], entonces *(ip+10) == &m[j+10]

y = *ip+10; Añade 10 al objeto *ip (objeto referenciado por ip) y lo asigna a y

*ip += 1; Equivale a: *ip = *ip + 1. Incrementa en 1 el valor (Rvalue) del objeto


referenciado por ip.

++*ip; Igual que el anterior: incrementa en 1 el valor del objeto referenciado


por ip

++ip; El resultado es otro puntero. Equivale a ip = ip+1, es decir,


incrementa en 1 el valor del puntero, con lo que el nuevo puntero
señala a otra posición (ver caso 1.)

ip++; Igual que el caso anterior. Incrementa en 1 el valor del puntero.


Ejemplos
(*ip)++ Igual que el caso 4. Dado que el paréntesis tiene máxima
precedencia y asocia de izquierda a derecha, incrementa en 1 el
valor del objeto referenciado por ip.

Sin el paréntesis la expresión modifica la posición de memoria


señalado por ip. Por tanto, la expresión *ip++ equivale a *(ip++)

*ip+1; El valor resultante es el de incrementar en 1 el valor del objeto


apuntado por ip
Ejercicios
Ejemplo
int x; int* ptr;

int x = 25; int* ptr = &x;

int* ptr = &x; int** pptr = &ptr;

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado)

int x = 25; int* ptr = &x;

int* ptr = &x; int** pptr = &ptr;

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

int* ptr = &x; int** pptr = &ptr;

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado) ptr puntero-a-entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado) ptr puntero-a-entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

ptr puntero-a-entero (iniciado)

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado) ptr puntero-a-entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

ptr puntero-a-entero (iniciado) pptr puntero-a-puntero a entero (iniciado)

tipoX x; tipoX* ptx;


Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado) ptr puntero-a-entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

ptr puntero-a-entero (iniciado) pptr puntero-a-puntero a entero (iniciado)

tipoX x; tipoX* ptx;

x es un objeto tipoX
Ejemplo
int x; int* ptr;

x es un entero (no iniciado) ptr puntero-a-entero (no iniciado)

int x = 25; int* ptr = &x;

x es un entero (iniciado) ptr puntero-a-entero (iniciado)

int* ptr = &x; int** pptr = &ptr;

ptr puntero-a-entero (iniciado) pptr puntero-a-puntero a entero (iniciado)

tipoX x; tipoX* ptx;

x es un objeto tipoX ptx es un puntero a tipoX (no iniciado)


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

tipoX (*ptr)[] = &m;

tipoX (*ptr)[3] = &m;

tipoX* mp[3]; tipoX* (*ptr)[] = ∓


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos


tipoX

tipoX (*ptr)[] = &m;

tipoX (*ptr)[3] = &m;

tipoX* mp[3]; tipoX* (*ptr)[] = ∓


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos ptr es un puntero al primer elemento de m (iniciado). Es por tanto un
tipoX puntero a tipoX

tipoX (*ptr)[] = &m;

tipoX (*ptr)[3] = &m;

tipoX* mp[3]; tipoX* (*ptr)[] = ∓


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos ptr es un puntero al primer elemento de m (iniciado). Es por tanto un
tipoX puntero a tipoX

tipoX (*ptr)[] = &m;

ptr es puntero-a-matriz abierta de tipoX (iniciado)

tipoX (*ptr)[3] = &m;

tipoX* mp[3]; tipoX* (*ptr)[] = ∓


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos ptr es un puntero al primer elemento de m (iniciado). Es por tanto un
tipoX puntero a tipoX

tipoX (*ptr)[] = &m;

ptr es puntero-a-matriz abierta de tipoX (iniciado)

tipoX (*ptr)[3] = &m;

ptr es puntero-a-matriz de tres objetos tipoX (iniciado)

tipoX* mp[3]; tipoX* (*ptr)[] = ∓


Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos ptr es un puntero al primer elemento de m (iniciado). Es por tanto un
tipoX puntero a tipoX

tipoX (*ptr)[] = &m;

ptr es puntero-a-matriz abierta de tipoX (iniciado)

tipoX (*ptr)[3] = &m;

ptr es puntero-a-matriz de tres objetos tipoX (iniciado)

tipoX* mp[3]; tipoX* (*ptr)[] = ∓

mp es una matriz de 3
punteros-a-tipoX
Ejemplos
tipoX m[3]; tipoX* ptr = &m[0];

m es una matriz de 3 objetos ptr es un puntero al primer elemento de m (iniciado). Es por tanto un
tipoX puntero a tipoX

tipoX (*ptr)[] = &m;

ptr es puntero-a-matriz abierta de tipoX (iniciado)

tipoX (*ptr)[3] = &m;

ptr es puntero-a-matriz de tres objetos tipoX (iniciado)

tipoX* mp[3]; tipoX* (*ptr)[] = ∓

mp es una matriz de 3 ptr es puntero-a-matriz abierta de punteros-a-tipoX (iniciado)


punteros-a-tipoX
Ejemplos

char* aP[] = {"Bien", "Mal"}; char* (*aPp) [] = &aP;

char (* mi[2])[3]; char (*(* ptr)[2])[3] = &mi;


Ejemplos

char* aP[] = {"Bien", "Mal"}; char* (*aPp) [] = &aP;

aP matriz de punteros-a-char
(iniciada)

char (* mi[2])[3]; char (*(* ptr)[2])[3] = &mi;


Ejemplos

char* aP[] = {"Bien", "Mal"}; char* (*aPp) [] = &aP;

aP matriz de punteros-a-char aPp puntero-a-matriz de punteros-a-char (iniciado)


(iniciada)

char (* mi[2])[3]; char (*(* ptr)[2])[3] = &mi;


Ejemplos

char* aP[] = {"Bien", "Mal"}; char* (*aPp) [] = &aP;

aP matriz de punteros-a-char aPp puntero-a-matriz de punteros-a-char (iniciado)


(iniciada)

char (* mi[2])[3]; char (*(* ptr)[2])[3] = &mi;

mi matriz de dos
punteros-a-matriz-de-tres
char
Ejemplos

char* aP[] = {"Bien", "Mal"}; char* (*aPp) [] = &aP;

aP matriz de punteros-a-char aPp puntero-a-matriz de punteros-a-char (iniciado)


(iniciada)

char (* mi[2])[3]; char (*(* ptr)[2])[3] = &mi;

mi matriz de dos ptr puntero-a-matriz de dos punteros-a-matriz de tres char


punteros-a-matriz-de-tres
char
Ejemplos

tipoX (*ptr)[5][7];

tipoX* func();

void func(int*);

tipoX (*ptr)();
Ejemplos

tipoX (*ptr)[5][7]; ptr es puntero-a-matriz de tipoX de dimensiones 5 y 7

tipoX* func();

void func(int*);

tipoX (*ptr)();
Ejemplos

tipoX (*ptr)[5][7]; ptr es puntero-a-matriz de tipoX de dimensiones 5 y 7

tipoX* func(); Función devolviendo puntero-a-tipoX.

void func(int*);

tipoX (*ptr)();
Ejemplos

tipoX (*ptr)[5][7]; ptr es puntero-a-matriz de tipoX de dimensiones 5 y 7

tipoX* func(); Funcion devolviendo puntero-a-tipoX.

void func(int*); Función devolviendo void y recibiendo puntero-a-int

tipoX (*ptr)();
Ejemplos

tipoX (*ptr)[5][7]; ptr es puntero-a-matriz de tipoX de dimensiones 5 y 7

tipoX* func(); Función devolviendo puntero-a-tipoX.

void func(int*); Función devolviendo void y recibiendo puntero-a-int

tipoX (*ptr)(); ptr es puntero a función que devuelve tipoX.


Ejercicio
Ejercicio
Punteros a funciones
Ejemplo

void (*fptr)();

void (*fptr)(int);

int (*fptr)(int, char);

int* (*fptr)(int*, char*);


Ejemplo

void (*fptr)(); fptr es un puntero a una función, sin parámetros, que devuelve
void.

void (*fptr)(int);

int (*fptr)(int, char);

int* (*fptr)(int*, char*);


Ejemplo

void (*fptr)(); fptr es un puntero a una función, sin parámetros, que devuelve
void.

void (*fptr)(int); fptr es un puntero a función que recibe un int como parámetro y
devuelve void.

int (*fptr)(int, char);

int* (*fptr)(int*, char*);


Ejemplo

void (*fptr)(); fptr es un puntero a una función, sin parámetros, que devuelve
void.

void (*fptr)(int); fptr es un puntero a función que recibe un int como parámetro y
devuelve void.

int (*fptr)(int, char); fptr es puntero a función, que acepta un int y un char como
argumentos y devuelve un int.

int* (*fptr)(int*, char*);


Ejemplo

void (*fptr)(); fptr es un puntero a una función, sin parámetros, que devuelve
void.

void (*fptr)(int); fptr es un puntero a función que recibe un int como parámetro y
devuelve void.

int (*fptr)(int, char); fptr es puntero a función, que acepta un int y un char como
argumentos y devuelve un int.

int* (*fptr)(int*, char*); fptr es puntero a función, que acepta sendos punteros a int y
char como argumentos, y devuelve un puntero a int.
Ejemplo
float (*(*fptr)(char))(int);

void * (*(*fptr)(int))[5];

char (*(*fptr)(int, float))();

long (*(*(*fptr)())[5])();
Ejemplo
float (*(*fptr)(char))(int); fptr es un puntero a función que recibe un char como argumento y
devuelve un puntero a función que recibe un int como argumento y
devuelve un float.

void * (*(*fptr)(int))[5];

char (*(*fptr)(int, float))();

long (*(*(*fptr)())[5])();
Ejemplo
float (*(*fptr)(char))(int); fptr es un puntero a función que recibe un char como argumento y
devuelve un puntero a función que recibe un int como argumento y
devuelve un float.

void * (*(*fptr)(int))[5]; fptr es un puntero a función que recibe un int como argumento y
devuelve un puntero a un array de 5 punteros-a-void (genéricos).

char (*(*fptr)(int, float))();

long (*(*(*fptr)())[5])();
Ejemplo
float (*(*fptr)(char))(int); fptr es un puntero a función que recibe un char como argumento y
devuelve un puntero a función que recibe un int como argumento y
devuelve un float.

void * (*(*fptr)(int))[5]; fptr es un puntero a función que recibe un int como argumento y
devuelve un puntero a un array de 5 punteros-a-void (genéricos).

char (*(*fptr)(int, float))(); fptr es un puntero a función que recibe dos argumentos (int y float),
devolviendo un puntero a función que no recibe argumentos y
devuelve un char.

long (*(*(*fptr)())[5])();
Ejemplo
float (*(*fptr)(char))(int); fptr es un puntero a función que recibe un char como argumento y
devuelve un puntero a función que recibe un int como argumento y
devuelve un float.

void * (*(*fptr)(int))[5]; fptr es un puntero a función que recibe un int como argumento y
devuelve un puntero a un array de 5 punteros-a-void (genéricos).

char (*(*fptr)(int, float))(); fptr es un puntero a función que recibe dos argumentos (int y float),
devolviendo un puntero a función que no recibe argumentos y
devuelve un char.

long (*(*(*fptr)())[5])(); fptr es un puntero a función que no recibe argumentos y devuelve un


puntero a un array de 5 punteros a función que no reciben ningún
parámetro y devuelven long.
Ejercicios
Estructura
Punteros , Estructuras
Typedef
Ayuda a definir nuevos nombres de datos, usando algunos de los tipos de
datos de C.

Sintaxis es: typedef tipo_dato nombre_variable;


Ejemplo
Uniones
Ejercicio

También podría gustarte