3-Punterosparámetros de Función
3-Punterosparámetros de Función
3-Punterosparámetros de Función
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -1-
JAIRO ENRIQUE MARTINEZ BANDA
e1=50;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int v=10;
modif(v);
printf("v=%d \n", v);
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -2-
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
#include <stdlib.h>
int main()
{
int v=10;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -3-
JAIRO ENRIQUE MARTINEZ BANDA
time_t time(time_t*tmp) ;
Esta función devuelve el valor del tiempo según una codificación interna al
sistema, o -1 si es imposible obtenerlo. Este valor también se copia a la
dirección del parámetro, excepto si este es NULL. Este tiempo interno al
sistema debe convertirse, por ejemplo, con la función:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -4-
JAIRO ENRIQUE MARTINEZ BANDA
struct tm{
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -5-
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int h, m, s;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -6-
JAIRO ENRIQUE MARTINEZ BANDA
return 0;
}
}t_trol;
void init(t_trol*p)
{
p->x=rand()%800;
p->y=rand()%600;
p->color=rand()%256;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -7-
JAIRO ENRIQUE MARTINEZ BANDA
t_trol t;
init(&t); // paso de la direccin de la struct t_trol
t_trol* ALL[10];
int i;
for (i=0; i<10; i++){
init(ALL[i]); // ¡ERROR! ALL[i] NO ASIGNADO
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -8-
JAIRO ENRIQUE MARTINEZ BANDA
El puntero es una variable como cualquier otra y, como tal, se puede pasar un
puntero por referencia, es decir, se puede pasar como valor del parámetro la
dirección de una variable puntero. La dirección de una variable puntero es un
puntero... de puntero. A continuación se muestra un ejemplo de una función
de asignación de memoria dinámica para una tabla de float que no utiliza el
sistema de retorno:
y la llamada en un main():
#include <stdio.h>
#include <stdlib.h>
int main()
{
float*tab;
int i;
asigna_mem(&tab,10);
for (i=0; i<10; i++){
tab[i]= (rand()%10000)/100.0;
printf("%f ",tab[i]);
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA -9-
JAIRO ENRIQUE MARTINEZ BANDA
putchar(\n);
return 0;
}
Son exactamente las mismas operaciones que para todas las variables,
excepto que la variable en cuestión es un puntero y se usa a continuación
como puntero. De este modo, en la función asigna_mem(), la expresión *f es
de tipo float*, lo que permite una asignación dinámica de una tabla de float.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 10 -
JAIRO ENRIQUE MARTINEZ BANDA
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 11 -
JAIRO ENRIQUE MARTINEZ BANDA
#include <stdio.h>
#include <stdlib.h>
int main()
{
int**mat;
asigna_mem(&mat,,
5 10); // direccin de mat pasada por referencia
inicializa(mat,,
5 10); // valor de mat (direccin de la matriz)
muestra(mat,,
5 10);
return 0;
}
}t_trol;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 12 -
JAIRO ENRIQUE MARTINEZ BANDA
void inicializa(t_trol**p)
{
*p=(t_trol*)malloc(sizeof(t_trol));
(*p)->x=rand()%800;
(*p)->y=rand()%600;
(*p)->color=rand()%256;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 13 -
JAIRO ENRIQUE MARTINEZ BANDA
// la tabla
}
#include <stdio.h>
#include <stdlib.h>
}t_trol;
void inicializa(t_trol**p)
{
*p=(t_trol*)malloc(sizeof(t_trol));
(*p)->x=rand()%800;
(*p)->y=rand()%600;
(*p)->color=rand()%256;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 14 -
JAIRO ENRIQUE MARTINEZ BANDA
void muestra(t_trol*t[])
{
int i;
for (i =0; i<NUMMAX; i++){
printf("%4d %4d %4d\n"
,t[i]->x,t[i]->y,t[i]->color);
}
}
int main()
{
t_trol* ALL[NUMMAX];
inicializa(ALL);
muestra(ALL);
return 0;
}
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 15 -
JAIRO ENRIQUE MARTINEZ BANDA
Escribir tres funciones idénticas de visualización con cada tabla distinta por
parámetro:
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 16 -
JAIRO ENRIQUE MARTINEZ BANDA
int x,y;
putchar(\n);
for (y=0;y<TY;y++){
putchar(\t);
for (x=0; x<TX; x++)
putchar(tab[y][x]);
putchar(\n);
}
putchar(\n);
}
¿Cómo se comporta la función test1 con los parámetros mat1, mat2 y mat3?
¿Cómo se comporta la función test2 con los parámetros mat1, mat2 y mat3?
¿Cómo se comporta la función test3 con los parámetros mat1, mat2 y mat3?
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 17 -
JAIRO ENRIQUE MARTINEZ BANDA
char mat1[TY] NO NO OK
[TX]
char*mat2[TY] OK OK NO
char**mat3 OK OK NO
#include <stdio.h>
#include <stdlib.h>
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 18 -
JAIRO ENRIQUE MARTINEZ BANDA
mat2[y]=(char*)malloc(sizeof(char)*TX);
for (x=0; x<TX; x++)
mat2[y][x]= 0+x;
}
mat3=(char**)malloc(sizeof(char*)*TY);
for (y=0;y<TY;y++){
mat3[y]=(char*)malloc(sizeof(char)*TX);
for (x=0; x<TX; x++)
mat3[y][x]= 0+x;
}
// primera serie de pruebas con mat1 como parÆmetro para cada funcin
printf("TEST 1 Paso de: char mat1[TY][TX] \n\n"
);
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 19 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 1
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 20 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 2
Ejercicio 3
ˇ
Introducción de valores y visualización.
ˇ
Intercambio de valores.
ˇ
Visualización del resultado.
ˇ
Salir o volver a empezar.
Ejercicio 4
Sea una tupla que incluya una posición (número real), un desplazamiento
(número real), una letra (entero) y un color (entero). En un programa:
ˇ
Definir un tipo y declarar dos tuplas.
ˇ
Escribir una función que permite inicializar dos tuplas en una sola
llamada (las tuplas se pasan por referencia).
ˇ
Escribir una función que permita intercambiar los contenidos de
ambas tuplas.
ˇ
Salir o volver a empezar.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 21 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 5
En un programa:
ˇ
Escribir una función de asignación dinámica de memoria para una
tabla de n enteros (el tamaño se obtiene o bien por el usuario o bien
de forma aleatoria).
ˇ
Escribir una función de inicialización con valores comprendidos entre
un valor umbral bajo y un valor umbral alto proporcionados como
parámetros de la función.
ˇ
Escribir una función de obtención de los valores umbral (bajo y alto).
ˇ
Escribir una función de visualización de una tabla de n elementos.
ˇ
Escribir una función que permita al contexto de la llamada determinar
los valores máximo y mínimo de una tabla de enteros de tamaño n
pasada por parámetro. La función no devuelve nada. Los valores
deben poder obtenerse en el contexto de la llamada sin uso de
variables globales.
Ejercicio 6
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 22 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejemplo: a=2;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 23 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejemplo: a=0xFF00;
Ejemplo: a=0 ;
Ejemplo: a=0
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 24 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejemplo: a=7654
Ejemplo: a=512;
Ejemplo: a=512;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 25 -
JAIRO ENRIQUE MARTINEZ BANDA
Ejercicio 7
ˇ
Los tamaños de una tabla de float y el tamaño de una tabla de
enteros se determinan al azar.
ˇ
Una función asigna memoria dinámicamente a las dos tablas a la
vez.
ˇ
Una función inicializa ambas tablas.
ˇ
Una función muestra ambas tablas.
ˇ
Salir o volver a empezar. Atención a la memoria.
Ejercicio 8
En un programa:
ˇ
El usuario entra el tamaño de una matriz.
ˇ
La matriz se asigna dinámicamente en un procedimiento (sin
retorno).
ˇ
Una función inicializa la matriz con valores.
ˇ
Una función muestra la matriz.
ˇ
Salir o volver a empezar. Atención a la memoria.
Ejercicio 9
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 26 -
JAIRO ENRIQUE MARTINEZ BANDA
char*s1,*s2,*s3,*s4;
ˇ
Una función permite introducir las cuatro cadenas a la vez.
ˇ
Una función permite visualizarlas una por una.
ˇ
Salir o volver a comenzar.
Ejercicio 10
ˇ
Definir una tupla t_trol (ver en este capítulo - secciones Principios de
un puntero - Caso de las tablas de punteros y Punteros como
parámetros de función - Paso por referencia de una tupla, para
typedef).
ˇ
Escribir una función de asignación de memoria dinámica para una
tabla de t_trol de 5 dimensiones con uso de return.
ˇ
Escribir una función de asignación de memoria dinámica para una
tabla de t_trol de 5 dimensiones sin uso de return.
ˇ
Escribir una función que asigne memoria dinámicamente a una tabla
de una dimensión de t_trol cuyo tamaño viene dado por parámetro.
ˇ
Escribir una función que asigne memoria dinámicamente a una tabla
de dos dimensiones cuyos tamaños vienen dados
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 27 -
JAIRO ENRIQUE MARTINEZ BANDA
por parámetro.
ˇ
Escribir una función que asigne memoria dinámicamente a una tabla
de tres dimensiones cuyos tamaños vienen dados por parámetro.
ˇ
Escribir una función que asigne memoria dinámicamente a una tabla
de cuatro dimensiones cuyos tamaños vienen dados por parámetro.
ˇ
Escribir una función que asigne memoria dinámicamente a una tabla
de cinco dimensiones cuyos tamaños vienen dados por parámetro.
En un main, dar un ejemplo de llamada que permita crear una tabla de t_trol
de 5 dimensiones cada una de ellas entrada por el usuario. Probar los
programas y añadir inicialización y visualización.
Ejercicio 11
int *tab;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 28 -
JAIRO ENRIQUE MARTINEZ BANDA
¿Qué funciones pueden usar tab como argumento? Escribir las funciones
designadas como válidas y realizar un programa de prueba. Dar las razones
por las que las otras han sido rechazadas.
Ejercicio 12
int **mat;
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 29 -
JAIRO ENRIQUE MARTINEZ BANDA
¿Qué funciones pueden usar tab como argumento? Escribir las funciones
designadas como válidas y realizar un programa de prueba. Dar las razones
por las que las otras han sido rechazadas.
© Éditions ENI - Todos los derechos reservados - Copia personal de JAIRO ENRIQUE MARTINEZ BANDA - 30 -