180 likes | 480 Views
TIPOS DE DATOS: EJERCICIOS. ESTRUCTURAS DE DATOS. RECUERDE * Y &. Si tengo una variable y Deseo obtener su dirección de memoria antepongo & Si tengo un puntero y Deseo conocer que almacena, antepongo * Son operadores que permiten conversión de datos int *pta, a=5, b;
E N D
TIPOS DE DATOS: EJERCICIOS ESTRUCTURAS DE DATOS
RECUERDE * Y & • Si tengo una variable y • Deseo obtener su dirección de memoria antepongo & • Si tengo un puntero y • Deseo conocer que almacena, antepongo * • Son operadores que permiten conversión de datos int *pta, a=5, b; pta = &a; //a es de tipo int, y con el & se obtiene un valor int * b = *pta; // pta es de tipo int *, y con el * se obtiene un valor int
ERRORES int *pta, *ptb, a, b; • Encuentre los errores en cada línea: Que pta apunte a a Que ptb apunte al mismo sitio que pta Que pta cambie de contenido a 8 Que ptb cambie de contenido aumentando 3 unidades Que ptb apunte a NULL Que b almacene 8 Que ptb apunte a b Que ptb cambie de contenido a a + 10 Imprima la suma de los contenidos de pta y ptb pta = *a; ptb = &pta; pta = 8; ptb = ptb + 3; ptb = &NULL; b = 8; *ptb = b; ptb = a + 10; printf(“%d”, pta + ptb);
EL DESTINO DE UN PUNTERO • Un puntero puede tener dos posibles caminos durante su existencia • Puede “apuntar” a un espacio de memoria de otra variable. int *a, b = 10; a = &b; //a no tiene memoria propia, es un “ESPEJO” de b • Puede “apuntar” a un espacio de memoria propio. Ejemplo int *a, b = 10; a = malloc (sizeof (int)); a = b; //a almacena en su propio cajón de memoria el mismo valor que b
RESULTADOS Y ERRORES int *ptc, b; b = malloc ( sizeof ( int ) ); *b = 8; ptc = malloc(sizeof(int)); ptc = b+5; free(*ptc); b = *ptc + 10; • Descubra los errores • char *pta, car1; • *pta = car1; • Determine el resultado que almacenan las variables al final • int *ptc, *ptn, b=20; • ptc = &b; • ptn = malloc ( sizeof (int)); • *ptn = b + 15; • *ptc = *ptc -1; • ptc = ptn; • *ptc = 2;
ARREGLOS Y PUNTEROS: RESULTADOS • int AE[4] = {4,1,5,2}, *p; • int i; • p = AE; • for(i = 0; i < 4; i++){ • p[i] = p[i] + 3; • } • p = malloc(sizeof(int)*9); • for(i = 0; i < 9; i++){ • p[i] = 5; • }
ARITMETICA DE PUNTEROS: CAMBIAR PROGRAMA • Cambie el código anterior para usar matemática de punteros • int AE[4] = {4,1,5,2}, *p; • int i; • p = AE; • for(i = 0; i < 4; i++){ • p[i] = p[i] + 3; • } • p = malloc(sizeof(int)*9); • for(i = 0; i < 9; i++){ • p[i] = 5; • }
ARITMETICA DE PUNTEROS: RESUELVA • Declare un puntero a char llamado B y otro llamado C • Asígnele memoria a B para 30 caracteres • Copie en B una palabra cualquiera • Usando aritmética de punteros, modifique todos los caracteres de la cadena para que pase de minus. a mayus. • Usando aritmética de punteros C debe apuntar al carácter de la mitad de la cadena B • Imprima C, que sale en pantalla?
ARITMETICA DE PUNTEROS: RESULTADOS int B[] = {3,4,1,2,7,12,-4}; float f = 4.234, *ptf; *(B+3) = *B + 15; ptf = &f; *B = (int)(*ptf); f = *ptf + 20; *(B + 5) = (int)(*ptf);
ARREGLOS DE PUNTEROS • Un arreglo puede ser de entero, de real, o de puntero a enteros, o puntero a real, etc. • Ejemplo: • int *A[4]; • A es un conjunto de punteros, cada uno puede apuntar a donde desee, • A otras variables o, • Comprar uno o varios cajoncitos propios for(i = 0; i < 3; i++){ A[i] = malloc (sizeof (int) * 3); } A[i] = NULL;
ARREGLOS DINAMICOS DE PUNTEROS • Al declarar por ejemplo: • int **A; • Es un puntero a puntero a entero. • Como podríamos usar esta variable? • Que formas habría para manipularla y utilizarla?
EJEMPLO • int **A; • A = malloc(sizeof(int *) * 10); • for(i = 0; i <10; i++){ • A[i] = malloc(sizeof(int)); • *A[i] = 0; • } int **A; A = malloc(sizeof(int *) * 10); for(i = 0; i <10; i++){ A[i] = malloc(sizeof(int)*5); for(j = 0; j<5; j++){ A[i][j] = 6; } }
EJERCICIOS DE REPASO • Escriba una función que dado un numero, lo modifique invirtiendo sus dígitos • Escriba una función que dada una matriz de NxN, permita conocer si la diagonal esta llena de valores diferentes de 0 y si ese es el caso, calcule la suma de los mismos. • Escriba una función que dado un arreglo, retorne otro nuevo solo con los elementos pares
EJERCICIOS DE REPASO • Escriba una función recursiva que dada dos cadenas, permita conocer si ambas son iguales. • Escriba una función recursiva que busque un elemento en un arreglo • Escriba una función recursiva que determine si una palabra es o no un palíndromo, sin usar string y usando aritmética de punteros
EJERCICIOS DE REPASO • Defina una estructura para representar un termino en un polinomio. Ejemplo: 3x5. • Cree una función MultiplicarEscalar que dado un término lo modifica multiplicándolo por un valor entero. • Defina una estructura para representar a un polinomio • Conjunto de n términos • Escriba una función Evaluar para que dado un polinomio de n términos y un valor entero, retorne el valor entero resultante de la evaluación del polinomio.
VOID * • Void significa el vacío, la nada • En lenguaje C puede tener dos usos • Indica que una función no retorna NADA, cuando void es utilizado como tipo de dato de retorno • void ImprimirEstudiante(Estudiante e); • Como un puntero genérico, cuando es utilizado como puntero (void *) • Un puntero genérico es aquel que puede apuntar a cualquier tipo de dato, sin ningún problema
EJEMPLOS DE VOID * char car1=‘B’, car2; void *ptg; ptg = &car1; car2 = *((char *)ptg) + 3; char cad[20], car3; void *ptg; ptg = cad; strcpy(cad, “Ejemplo”); car3 = *((char *)(ptg) + 3) + 5;
PARA PENSAR • Se podría declarar un arreglo de void *? • Que utilidad tendría?