SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
Evaluación escrita
 Indique como se realiza la declaración y la
 llamada a una función
 Indique como se declara y asigna valores a un
 array
 Describa las ventajas de usar estructuras y como se
 declaran
Ejercicios
 Elabore un programa que lea una cadena de 50
 caracteres y convierta las vocales en mayúsculas
 Elabore un programa que obtenga el determinante
 de una matriz 3x3 ingresada por el usuario
PUNTEROS
(
(APUNTADORES)
            )
Sugerencias y herramientas para crear para crear y presentar diapositivas en
formato panorámico
Contenido
 Direcciones en memoria   Aritmética de punteros
                                        p
 Concepto de puntero      Punteros constantes frente
 (apuntador)              a punteros a constantes
 Puntero null y void
 P t       ll     id      Punteros como argumento
 Punteros a punteros      de funciones
 Punteros a Arrays        Punteros a funciones
 Arrays de punteros       Punteros a estructuras
 Punteros a cadenas       Ejercicios
                           j
Dirección de memoria
 Cuando una variable se declara, se asocian tres
                                   ,
 atributos fundamentales con la misma: su nombre, su
 tipo y su dirección de memoria
   Int n;
   Asocia al nombre n, el tipo int y la dirección de alguna
                            p                          g
   posición de memoria donde se almacena el valor de n
Cont…
Cont
 Al valor de la variable se accede por medio de su
                                    p
 nombre. Por ejemplo, se puede imprimir el valor de n
 con la sentencia;
   Printf (“%d”,n);
 A la dirección de la variable se accede por medio del
 operador de dirección &. Por ejemplo, se puede
 imprimir la dirección de n con la sentencia:
   Printf (“%p”,&n);
   P i tf (“% ” & )
Ejemplo 10 1
        10.1
 Obtener el valor y la dirección de una variable
    #include
    # l d <stdio.h>
                 d h
    #include <stdlib.h>
    int main ()
    {
          int n=75;
          printf("n=%dn",n);
          printf( &n=%pn &n);
          printf("&n=%pn",&n);
          system("pause");
          return 0;
          }
Concepto de puntero (apuntador)
 Un puntero es una variable que contiene una dirección de memoria
 El tipo de variable que almacena una dirección se denomina puntero
 Los punteros se rigen por estas reglas básicas:
   Un puntero es una variable como cualquier otra;
   Una variable puntero contiene una dirección que apunta a otra posición
   en memoria
   En esa posición se almacenan los datos a los que apunta el puntero
   Un puntero apunta a una variable de memoria
Ejemplo 10 2
        10.2
 #include <stdio.h>
 #include <stdlib.h>
 #i l d < dlib h>
 int main ()
 {
     int 75
     i n=75;
     int*p=&n;
     printf("n=%d, &n=%p, p=%pn",n,&n,p);
     printf("&p=%pn",&p);
        i tf("& %  " & )
     system("PAUSE");
     return 0;
 }
Declaración de punteros
 Al igual que cualquier variable, las variables punteros
     g     q      q             ,               p
 han de ser declaradas antes de utilizarlas. La
 declaración de una variable puntero debe indicar al
 compilador el tipo de dato al que apunta el puntero;
 para ello se hace preceder a su nombre con un
 asterisco (*)
 <tipo de dato apuntado>*<identificador de puntero>
 Float*f;
 Fl t*f
Inicialización de punteros
 La inicialización de un puntero proporciona a ese puntero la
 dirección del dato correspondiente. Para asignar una
 dirección de memoria a un puntero se utiliza el operador de
 referencia &.
 &valor
   Int i;
   Int *p;
   P=&i; /*asigna la dirección de i a p*/
   *p=50; /*asigna un valor a la dirección de memoria /
     p 50; / asigna                           memoria*/
Indireccion de punteros
                           #include <stdio.h>
 El uso de un puntero      #include <stdlib h>
                                    <stdlib.h>
                           char c;
 para obtener el valor     int main()

 al que apunta es decir,
         apunta, decir     {
                               char *pc;

 su dato apuntado se           pc=&c;
                               for(c='A';c<='Z';c++)

 denomina indireccionar        printf("%c",*pc);
                               printf("n");

 el puntero                    system("pause");
                               return 0;
                           }
Punteros null y void
 Un puntero nulo no apunta a ninguna parte, no direcciona ningún dato
 valido en memoria
   lid          i
    #define NULL 0
 Otra forma de declarar un puntero nulo es asignar un valor de 0
    Int *ptr=0;
 Los punteros nulos se utilizan con frecuencia en programas con arrays de
 punteros
 En C se puede declarar un puntero de modo que apunte a cualquier tipo
 de dato, es decir, no se asigna a un tipo de dato especifico. El método es
 declarar el puntero como puntero void* denominado puntero genérico
    Void *prt
Punteros a punteros
 Un puntero puede apuntar a otra variable puntero. Este
 concepto se utiliza con mucha frecuencia en programas
 complejos de C. para declarar un puntero a un puntero
     p j           p               p             p
 se hace preceder a la variable con dos asteriscos (**)
   Int valor_e=100;;
   Int *ptr1=&valor_e;
   Int **ptr5=&ptr1;
         ptr5 &ptr1;
Punteros y Arrays
 Se pueden direccionar arrays como si fueran
      p                       y
 punteros y punteros como si fueran arrays. La
 posibilidad de almacenar y acceder a punteros y
 arrays, implica que se pueden almacenar cadenas
 de datos en elementos de arrays. Sin punteros eso
 no es posible, ya que no existe el tipo de dato
 cadena en C. no existen variables de cadena,
 únicamente constantes d cadena
 ú i                   de d
Nombres de arrays como punteros
 Un nombre de un array es simplemente un puntero.
 Supongamos que se tiene la siguiente declaración de un
 array:
 In lista[5]={10 20 30 40 50}
    lista[5]={10,20,30,40,50}
 Si se manda a visualizar lista[0] se vera 10 y si se manda a
 visualizar *lista. Como un nombre de un array es un puntero,
 también se vera 10  0
 Dado que un nombre de un array contiene la dirección del
 primer elemento del array se debe indireccionar el puntero
                       array,
 para obtener el valor del elemento
Arrays de punteros
 Si se necesita reservar muchos punteros a muchos
                                    p
 valores diferentes, se puede declara un array de
 punteros. Un array de punteros es un array que
 contiene como elementos punteros, cada uno de los
 cuales apunta a un tipo de dato especifico. La linea
 siguiente reserva un array de diez variables puntero a
 enteros:
 Int *ptr[10];
      ptr[10];
Inicialización de un array de punteros a cadenas
 La inicialización de un array de punteros a cadenas
 se puede realizar con una declaración similar a
 esta;
 Char
 *nombres_meses[12]={“enero”,”febrero”,”marzo”,”
 *     b           [12]={“       ” ”f b    ””      ””
 abril”,”mayo”,”junio”,”julio”,”agosto”,”septiembre”,”
 octubre”,”noviembre”,”diciembre”};
     b ” ” i b ” ”di i b ”}
Punteros de cadenas
 Los punteros se pueden utilizar en lugar de índices
     p           p                    g
 de arrays. Considérese la siguiente declaración de
 un array de caracteres que contiene las letras del
 alfabeto;
 Char alfabeto[27]=“ABCDE….z”;
               [ ]               ;
 P=&alfabeto[0]
 Printf( %cn p);
 Printf(“%cn”,*p);
Aritmética de punteros
 Al contrario que un nombre de un array, que es un puntero constante y no
 se puede modificar, un puntero es una variable que se puede modificar.
        d      difi            t               i bl           d     difi
 Como consecuencia, se pueden realizar ciertas operaciones aritméticas
 sobre punteros
 A un puntero se le puede sumar o restar un entero n; esto hace que apunte
 n posiciones adelante, o atrás del actual. Las operaciones no validas son;
 suma, multiplicación o división entre dos punteros
    Float m[20];
    Float *r;
    r=m;
    r++
Ejemplo conversión de caracteres 10 8
                                 10.8
 Convierte caracteres de minúsculas a mayúsculas
Punteros constantes frente a punteros a constantes

  Un puntero constante es un puntero que no se puede
  cambiar, pero que los datos apuntados por el
  puntero pueden ser cambiados Por otra parte un
                      cambiados.            parte,
  puntero a una constante se puede modificar para
  apuntar a una constante diferente pero los datos
                            diferente,
  apuntados por el puntero no se pueden cambiar
Punteros constantes
 Para crear un puntero constante diferente de un array,
 se debe utilizar el siguiente formato:
   <Tipo de dato>*const<nombre puntero>=<dirección de
   variable>;
   Int x;
   Int y;
   Int *const p1=&x;
   *p1=y, es legal ya que se cambia el contenido de memoria
   p1=&y , no es legal ya que se cambia el valor del puntero
Punteros a constantes
 El formato para definir un puntero a una constante es;
            p               p                         ;
   Const<tipo de dato elemento>*<nombre
   puntero>=<dirección de constante>;
   Const int x=25;
   Const int y=50;
   Const int *p1=&x;
   P1=&y, p1 apunta a otra constante
   *p1=15,
   * 1 15 crea un error de compilación
                         d      il ió
Punteros constantes a constantes
 El ultimo caso a considerar es crear punteros constantes
 a constantes utilizando el formato siguiente;
   Const <tipo de dato elemento> *const <nombre
   puntero>=<direccion de constante>;
   Const int x=25;
   Const int *const p1=&x;
                    p    ;
   P1 es un entero constante que apunta a una constante
   entera x, cualquier intento de modificar p1 o bien *p1
   producirá un error
Punteros como argumentos de funciones
 Cuando se pasa una variable a una función (paso por valor)
 no se puede cambiar el valor de esa variable. Sin embargo,
 si se pasa un puntero a una variable a una función (paso
 p
 por dirección) se puede cambiar el valor de la variable
              ) p
   Void func1 (int *s, int t)   int i, j;
   {                            i=5;
   *s=6;
   * 6                          j=7;
                                j 7
   t=25;                        func1 (&i, j);
   }
Punteros a funciones
 Es posible crear punteros que apunten a funciones. En lugar
    p               p         q     p                      g
 de direccionar datos, los punteros de funciones apuntan a
 código ejecutable. Al igual que los datos, las funciones se
 almacenan en memoria y tienen direcciones iniciales En C se
                                                iniciales.
 pueden asignar las direcciones iniciales de funciones a
 p
 punteros. Tales funciones se pueden llamar en un modo
                                  p
 indirecto, es decir mediante un puntero cuyo valor es igual a
 la dirección inicial de la función en cuestión
   Tipo_de_retorno (*
   Ti   d          (*punteroFuncion) ( li d parametros>);
                            F i ) (<lista de           )
Cont…
Cont
 Un puntero a una función es simplemente un puntero cuyo
     p                            p             p          y
 valor es la dirección del nombre de la función. Dado que el
 nombre es, en si mismo, un puntero; un puntero a una función
 es un puntero a un puntero constante
Inicialización de un puntero a una función
 La sintaxis general para inicializar un puntero a una función
 es:
 punteroFuncion = una función
   double calculo (int*v unsigned n) /*prototipo de función*/
                   (int*v;          n);
   double (*qf) (int*, unsigned); /*puntero a función*/
   Int r[5]={3,5,6,7,1}
            {          }
   double x;
   qf=calculo; /*asigna dirección de la función*/
   x=qf(r,5); /*llamada a la función con el p ntero a función*/
     =qf(r 5)                  f nción       puntero f nción*/
Ejemplo 10 6
        10.6
 Se desea ordenar un array de numero reales, la
 ordenación se va a realizar con la función qsort()
Arrays de punteros de funciones
 Ciertas aplicaciones requieren disponer de numerosas
            p               q          p
 funciones, basadas en el cumplimiento de ciertas
 condiciones. Un método para implementar tal aplicación es
 utilizar una sentencia switch con muchos selectores casecase.
 Otra solución es utilizar un array de punteros de función. Se
 p
 puede seleccionar una función de la lista y llamarla
 La sintaxis general de un array de punteros de función es:
   tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)
Punteros a estructuras
 Un puntero también puede apuntar a una estructura. Se
    p                 p        p
 puede declarar un puntero a una estructura tal como se
 declara un puntero a cualquier otro objeto y se declara
 un puntero estructura tal como se declara cualquier otra
 variable estructura: especificando un puntero en lugar
 del nombre de la variable estructura
   Strcuct persona *p; /*se crea un puntero de estructura*/
   p=&empleado;
Ejemplo 10 9
        10.9
 En este ejemplo se declara el tipo estructura
 t_persona, que se asocia con el tipo persona para
 facilidad de escritura Un array de esta estructura
                escritura.
 se inicializa con campos al azar y se muestran por
 pantalla
Ejercicios
 Escribir un programa en que se lean 20 líneas de texto, cada línea
 con un máximo d 80 caracteres. M
           á i de                 Mostrar por pantalla el numero d
                                                    ll l          de
 vocales que tiene cada línea
 Se requiere evaluar las funciones f(x), g(x) y z(x) para todos los
 valores de x en el intervalo 0<=x<=3.5 con incrementos de 0.2.
 escribir un programa que evalué dichas funciones, utilizar un array
 de punteros a función.
   Las funciones son las siguientes;
   F(x)=3*ex-2x
   G(x)=-x*Sin(x)+1.5
     ( )       ( )
   Z(x)=x3-2x+1
Patrón de prueba de pantalla panorámica (16:9)




                               Prueba de la
                                relación de
                                  aspecto
                            (Debe parecer circular)




       4x3

16x9

Weitere ähnliche Inhalte

Was ist angesagt? (20)

Luis hernandez 22310621
Luis hernandez   22310621Luis hernandez   22310621
Luis hernandez 22310621
 
Clase1 c
Clase1 cClase1 c
Clase1 c
 
2 punteros y lenguaje c
2 punteros y lenguaje c2 punteros y lenguaje c
2 punteros y lenguaje c
 
Solucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectoresSolucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectores
 
Trabajo programacion 1 jose silva
Trabajo programacion 1 jose silvaTrabajo programacion 1 jose silva
Trabajo programacion 1 jose silva
 
08 - Punteros en lenguaje C
08 - Punteros en lenguaje C08 - Punteros en lenguaje C
08 - Punteros en lenguaje C
 
Lenguaje de programación c
Lenguaje de programación cLenguaje de programación c
Lenguaje de programación c
 
Informe tecnico victor_uex
Informe tecnico victor_uexInforme tecnico victor_uex
Informe tecnico victor_uex
 
Ejercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectoresEjercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectores
 
1 Tipos De Datos Ejercicios
1 Tipos De Datos Ejercicios1 Tipos De Datos Ejercicios
1 Tipos De Datos Ejercicios
 
Programar en c
Programar en cProgramar en c
Programar en c
 
Funciones en Lenguaje C
Funciones en Lenguaje CFunciones en Lenguaje C
Funciones en Lenguaje C
 
Punteros2
Punteros2Punteros2
Punteros2
 
ED 01 tipos_datos_ejercicios
ED 01 tipos_datos_ejerciciosED 01 tipos_datos_ejercicios
ED 01 tipos_datos_ejercicios
 
Arreglos
ArreglosArreglos
Arreglos
 
Teoria punteros
Teoria punterosTeoria punteros
Teoria punteros
 
Guia De Practica 3
Guia De Practica 3Guia De Practica 3
Guia De Practica 3
 
Tipos de datos en C
Tipos de datos en CTipos de datos en C
Tipos de datos en C
 
Act. Individual.- Pseudocódigos y diagramas de flujo
 Act. Individual.- Pseudocódigos y diagramas de flujo Act. Individual.- Pseudocódigos y diagramas de flujo
Act. Individual.- Pseudocódigos y diagramas de flujo
 
Punteros 2012
Punteros 2012Punteros 2012
Punteros 2012
 

Andere mochten auch

Que es_mision
 Que es_mision Que es_mision
Que es_misiondiego MC
 
Clase 9- programacion
Clase 9- programacionClase 9- programacion
Clase 9- programaciondiego MC
 
Clase 10_ programacion
Clase 10_ programacionClase 10_ programacion
Clase 10_ programaciondiego MC
 
Neurociencias 4
Neurociencias 4Neurociencias 4
Neurociencias 4diego MC
 
Sicolog a evolutiva_contenido
Sicolog a evolutiva_contenidoSicolog a evolutiva_contenido
Sicolog a evolutiva_contenidodiego MC
 
Contenido cient fico(didactica especial)
Contenido cient fico(didactica especial)Contenido cient fico(didactica especial)
Contenido cient fico(didactica especial)diego MC
 

Andere mochten auch (8)

Que es_mision
 Que es_mision Que es_mision
Que es_mision
 
Clase 9- programacion
Clase 9- programacionClase 9- programacion
Clase 9- programacion
 
Clase 6
Clase 6Clase 6
Clase 6
 
Clase 10_ programacion
Clase 10_ programacionClase 10_ programacion
Clase 10_ programacion
 
Neurociencias 4
Neurociencias 4Neurociencias 4
Neurociencias 4
 
Sicolog a evolutiva_contenido
Sicolog a evolutiva_contenidoSicolog a evolutiva_contenido
Sicolog a evolutiva_contenido
 
Contenido cient fico(didactica especial)
Contenido cient fico(didactica especial)Contenido cient fico(didactica especial)
Contenido cient fico(didactica especial)
 
Ejercicios de arreglo
Ejercicios de arregloEjercicios de arreglo
Ejercicios de arreglo
 

Ähnlich wie Clase 11- fundamentos de la programacion

Apuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasApuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasXendor Resendiz
 
Computacion punteros
Computacion punterosComputacion punteros
Computacion punterosManuel
 
Gestión Dinámica de la Memoria
Gestión Dinámica de la MemoriaGestión Dinámica de la Memoria
Gestión Dinámica de la MemoriaMago Julio Cesar
 
Arreglos
ArreglosArreglos
ArreglosAnt Jfr
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datosluna_72
 
Matrices Y Punteros - Sergio Cabello
Matrices Y Punteros - Sergio CabelloMatrices Y Punteros - Sergio Cabello
Matrices Y Punteros - Sergio Cabellosergiocabello
 
Implementacion de punteros
Implementacion de punterosImplementacion de punteros
Implementacion de punterosKareliaRivas
 
Introducción a los Punteros en el lenguaje C
Introducción a los Punteros en el lenguaje CIntroducción a los Punteros en el lenguaje C
Introducción a los Punteros en el lenguaje CDiego Santimateo
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacionYsaac Ruiz
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionandreinagracielarojasadam
 
Fundamentos de programación en scilab
Fundamentos de programación en scilabFundamentos de programación en scilab
Fundamentos de programación en scilabGabriel Romero
 
1.Tipos de Datos.ppt
1.Tipos de Datos.ppt1.Tipos de Datos.ppt
1.Tipos de Datos.pptmarcos793515
 
1.Tipos de Datos.ppt
1.Tipos de Datos.ppt1.Tipos de Datos.ppt
1.Tipos de Datos.pptSANTOS400018
 

Ähnlich wie Clase 11- fundamentos de la programacion (19)

Apuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasApuntadores, cadenas y estructuras
Apuntadores, cadenas y estructuras
 
Computacion punteros
Computacion punterosComputacion punteros
Computacion punteros
 
Material iii parcial
Material iii parcialMaterial iii parcial
Material iii parcial
 
Gestión Dinámica de la Memoria
Gestión Dinámica de la MemoriaGestión Dinámica de la Memoria
Gestión Dinámica de la Memoria
 
Arreglos
ArreglosArreglos
Arreglos
 
Tipos De Datos
Tipos De DatosTipos De Datos
Tipos De Datos
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datos
 
Matrices Y Punteros - Sergio Cabello
Matrices Y Punteros - Sergio CabelloMatrices Y Punteros - Sergio Cabello
Matrices Y Punteros - Sergio Cabello
 
Implementacion de punteros
Implementacion de punterosImplementacion de punteros
Implementacion de punteros
 
Introducción a los Punteros en el lenguaje C
Introducción a los Punteros en el lenguaje CIntroducción a los Punteros en el lenguaje C
Introducción a los Punteros en el lenguaje C
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacion
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacion
 
Punteros yo
Punteros yoPunteros yo
Punteros yo
 
Apuntadores
Apuntadores Apuntadores
Apuntadores
 
Fundamentos de programación en scilab
Fundamentos de programación en scilabFundamentos de programación en scilab
Fundamentos de programación en scilab
 
Arreglos
ArreglosArreglos
Arreglos
 
1.Tipos de Datos.ppt
1.Tipos de Datos.ppt1.Tipos de Datos.ppt
1.Tipos de Datos.ppt
 
1.Tipos de Datos.ppt
1.Tipos de Datos.ppt1.Tipos de Datos.ppt
1.Tipos de Datos.ppt
 
1.Tipos de Datos.ppt
1.Tipos de Datos.ppt1.Tipos de Datos.ppt
1.Tipos de Datos.ppt
 

Mehr von diego MC

Neurociencias 4
Neurociencias 4Neurociencias 4
Neurociencias 4diego MC
 
Presentacion unidad 4_neurociencias
Presentacion unidad 4_neurocienciasPresentacion unidad 4_neurociencias
Presentacion unidad 4_neurocienciasdiego MC
 

Mehr von diego MC (7)

Clase 5
Clase 5Clase 5
Clase 5
 
Clase 4
Clase 4Clase 4
Clase 4
 
Clase 3
Clase 3Clase 3
Clase 3
 
Clase 2
Clase 2Clase 2
Clase 2
 
Clase 1
Clase 1Clase 1
Clase 1
 
Neurociencias 4
Neurociencias 4Neurociencias 4
Neurociencias 4
 
Presentacion unidad 4_neurociencias
Presentacion unidad 4_neurocienciasPresentacion unidad 4_neurociencias
Presentacion unidad 4_neurociencias
 

Clase 11- fundamentos de la programacion

  • 1. Evaluación escrita Indique como se realiza la declaración y la llamada a una función Indique como se declara y asigna valores a un array Describa las ventajas de usar estructuras y como se declaran
  • 2. Ejercicios Elabore un programa que lea una cadena de 50 caracteres y convierta las vocales en mayúsculas Elabore un programa que obtenga el determinante de una matriz 3x3 ingresada por el usuario
  • 3. PUNTEROS ( (APUNTADORES) ) Sugerencias y herramientas para crear para crear y presentar diapositivas en formato panorámico
  • 4. Contenido Direcciones en memoria Aritmética de punteros p Concepto de puntero Punteros constantes frente (apuntador) a punteros a constantes Puntero null y void P t ll id Punteros como argumento Punteros a punteros de funciones Punteros a Arrays Punteros a funciones Arrays de punteros Punteros a estructuras Punteros a cadenas Ejercicios j
  • 5. Dirección de memoria Cuando una variable se declara, se asocian tres , atributos fundamentales con la misma: su nombre, su tipo y su dirección de memoria Int n; Asocia al nombre n, el tipo int y la dirección de alguna p g posición de memoria donde se almacena el valor de n
  • 6. Cont… Cont Al valor de la variable se accede por medio de su p nombre. Por ejemplo, se puede imprimir el valor de n con la sentencia; Printf (“%d”,n); A la dirección de la variable se accede por medio del operador de dirección &. Por ejemplo, se puede imprimir la dirección de n con la sentencia: Printf (“%p”,&n); P i tf (“% ” & )
  • 7. Ejemplo 10 1 10.1 Obtener el valor y la dirección de una variable #include # l d <stdio.h> d h #include <stdlib.h> int main () { int n=75; printf("n=%dn",n); printf( &n=%pn &n); printf("&n=%pn",&n); system("pause"); return 0; }
  • 8. Concepto de puntero (apuntador) Un puntero es una variable que contiene una dirección de memoria El tipo de variable que almacena una dirección se denomina puntero Los punteros se rigen por estas reglas básicas: Un puntero es una variable como cualquier otra; Una variable puntero contiene una dirección que apunta a otra posición en memoria En esa posición se almacenan los datos a los que apunta el puntero Un puntero apunta a una variable de memoria
  • 9. Ejemplo 10 2 10.2 #include <stdio.h> #include <stdlib.h> #i l d < dlib h> int main () { int 75 i n=75; int*p=&n; printf("n=%d, &n=%p, p=%pn",n,&n,p); printf("&p=%pn",&p); i tf("& % " & ) system("PAUSE"); return 0; }
  • 10. Declaración de punteros Al igual que cualquier variable, las variables punteros g q q , p han de ser declaradas antes de utilizarlas. La declaración de una variable puntero debe indicar al compilador el tipo de dato al que apunta el puntero; para ello se hace preceder a su nombre con un asterisco (*) <tipo de dato apuntado>*<identificador de puntero> Float*f; Fl t*f
  • 11. Inicialización de punteros La inicialización de un puntero proporciona a ese puntero la dirección del dato correspondiente. Para asignar una dirección de memoria a un puntero se utiliza el operador de referencia &. &valor Int i; Int *p; P=&i; /*asigna la dirección de i a p*/ *p=50; /*asigna un valor a la dirección de memoria / p 50; / asigna memoria*/
  • 12. Indireccion de punteros #include <stdio.h> El uso de un puntero #include <stdlib h> <stdlib.h> char c; para obtener el valor int main() al que apunta es decir, apunta, decir { char *pc; su dato apuntado se pc=&c; for(c='A';c<='Z';c++) denomina indireccionar printf("%c",*pc); printf("n"); el puntero system("pause"); return 0; }
  • 13. Punteros null y void Un puntero nulo no apunta a ninguna parte, no direcciona ningún dato valido en memoria lid i #define NULL 0 Otra forma de declarar un puntero nulo es asignar un valor de 0 Int *ptr=0; Los punteros nulos se utilizan con frecuencia en programas con arrays de punteros En C se puede declarar un puntero de modo que apunte a cualquier tipo de dato, es decir, no se asigna a un tipo de dato especifico. El método es declarar el puntero como puntero void* denominado puntero genérico Void *prt
  • 14. Punteros a punteros Un puntero puede apuntar a otra variable puntero. Este concepto se utiliza con mucha frecuencia en programas complejos de C. para declarar un puntero a un puntero p j p p p se hace preceder a la variable con dos asteriscos (**) Int valor_e=100;; Int *ptr1=&valor_e; Int **ptr5=&ptr1; ptr5 &ptr1;
  • 15. Punteros y Arrays Se pueden direccionar arrays como si fueran p y punteros y punteros como si fueran arrays. La posibilidad de almacenar y acceder a punteros y arrays, implica que se pueden almacenar cadenas de datos en elementos de arrays. Sin punteros eso no es posible, ya que no existe el tipo de dato cadena en C. no existen variables de cadena, únicamente constantes d cadena ú i de d
  • 16. Nombres de arrays como punteros Un nombre de un array es simplemente un puntero. Supongamos que se tiene la siguiente declaración de un array: In lista[5]={10 20 30 40 50} lista[5]={10,20,30,40,50} Si se manda a visualizar lista[0] se vera 10 y si se manda a visualizar *lista. Como un nombre de un array es un puntero, también se vera 10 0 Dado que un nombre de un array contiene la dirección del primer elemento del array se debe indireccionar el puntero array, para obtener el valor del elemento
  • 17. Arrays de punteros Si se necesita reservar muchos punteros a muchos p valores diferentes, se puede declara un array de punteros. Un array de punteros es un array que contiene como elementos punteros, cada uno de los cuales apunta a un tipo de dato especifico. La linea siguiente reserva un array de diez variables puntero a enteros: Int *ptr[10]; ptr[10];
  • 18. Inicialización de un array de punteros a cadenas La inicialización de un array de punteros a cadenas se puede realizar con una declaración similar a esta; Char *nombres_meses[12]={“enero”,”febrero”,”marzo”,” * b [12]={“ ” ”f b ”” ”” abril”,”mayo”,”junio”,”julio”,”agosto”,”septiembre”,” octubre”,”noviembre”,”diciembre”}; b ” ” i b ” ”di i b ”}
  • 19. Punteros de cadenas Los punteros se pueden utilizar en lugar de índices p p g de arrays. Considérese la siguiente declaración de un array de caracteres que contiene las letras del alfabeto; Char alfabeto[27]=“ABCDE….z”; [ ] ; P=&alfabeto[0] Printf( %cn p); Printf(“%cn”,*p);
  • 20. Aritmética de punteros Al contrario que un nombre de un array, que es un puntero constante y no se puede modificar, un puntero es una variable que se puede modificar. d difi t i bl d difi Como consecuencia, se pueden realizar ciertas operaciones aritméticas sobre punteros A un puntero se le puede sumar o restar un entero n; esto hace que apunte n posiciones adelante, o atrás del actual. Las operaciones no validas son; suma, multiplicación o división entre dos punteros Float m[20]; Float *r; r=m; r++
  • 21. Ejemplo conversión de caracteres 10 8 10.8 Convierte caracteres de minúsculas a mayúsculas
  • 22. Punteros constantes frente a punteros a constantes Un puntero constante es un puntero que no se puede cambiar, pero que los datos apuntados por el puntero pueden ser cambiados Por otra parte un cambiados. parte, puntero a una constante se puede modificar para apuntar a una constante diferente pero los datos diferente, apuntados por el puntero no se pueden cambiar
  • 23. Punteros constantes Para crear un puntero constante diferente de un array, se debe utilizar el siguiente formato: <Tipo de dato>*const<nombre puntero>=<dirección de variable>; Int x; Int y; Int *const p1=&x; *p1=y, es legal ya que se cambia el contenido de memoria p1=&y , no es legal ya que se cambia el valor del puntero
  • 24. Punteros a constantes El formato para definir un puntero a una constante es; p p ; Const<tipo de dato elemento>*<nombre puntero>=<dirección de constante>; Const int x=25; Const int y=50; Const int *p1=&x; P1=&y, p1 apunta a otra constante *p1=15, * 1 15 crea un error de compilación d il ió
  • 25. Punteros constantes a constantes El ultimo caso a considerar es crear punteros constantes a constantes utilizando el formato siguiente; Const <tipo de dato elemento> *const <nombre puntero>=<direccion de constante>; Const int x=25; Const int *const p1=&x; p ; P1 es un entero constante que apunta a una constante entera x, cualquier intento de modificar p1 o bien *p1 producirá un error
  • 26. Punteros como argumentos de funciones Cuando se pasa una variable a una función (paso por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero a una variable a una función (paso p por dirección) se puede cambiar el valor de la variable ) p Void func1 (int *s, int t) int i, j; { i=5; *s=6; * 6 j=7; j 7 t=25; func1 (&i, j); }
  • 27. Punteros a funciones Es posible crear punteros que apunten a funciones. En lugar p p q p g de direccionar datos, los punteros de funciones apuntan a código ejecutable. Al igual que los datos, las funciones se almacenan en memoria y tienen direcciones iniciales En C se iniciales. pueden asignar las direcciones iniciales de funciones a p punteros. Tales funciones se pueden llamar en un modo p indirecto, es decir mediante un puntero cuyo valor es igual a la dirección inicial de la función en cuestión Tipo_de_retorno (* Ti d (*punteroFuncion) ( li d parametros>); F i ) (<lista de )
  • 28. Cont… Cont Un puntero a una función es simplemente un puntero cuyo p p p y valor es la dirección del nombre de la función. Dado que el nombre es, en si mismo, un puntero; un puntero a una función es un puntero a un puntero constante
  • 29. Inicialización de un puntero a una función La sintaxis general para inicializar un puntero a una función es: punteroFuncion = una función double calculo (int*v unsigned n) /*prototipo de función*/ (int*v; n); double (*qf) (int*, unsigned); /*puntero a función*/ Int r[5]={3,5,6,7,1} { } double x; qf=calculo; /*asigna dirección de la función*/ x=qf(r,5); /*llamada a la función con el p ntero a función*/ =qf(r 5) f nción puntero f nción*/
  • 30. Ejemplo 10 6 10.6 Se desea ordenar un array de numero reales, la ordenación se va a realizar con la función qsort()
  • 31. Arrays de punteros de funciones Ciertas aplicaciones requieren disponer de numerosas p q p funciones, basadas en el cumplimiento de ciertas condiciones. Un método para implementar tal aplicación es utilizar una sentencia switch con muchos selectores casecase. Otra solución es utilizar un array de punteros de función. Se p puede seleccionar una función de la lista y llamarla La sintaxis general de un array de punteros de función es: tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)
  • 32. Punteros a estructuras Un puntero también puede apuntar a una estructura. Se p p p puede declarar un puntero a una estructura tal como se declara un puntero a cualquier otro objeto y se declara un puntero estructura tal como se declara cualquier otra variable estructura: especificando un puntero en lugar del nombre de la variable estructura Strcuct persona *p; /*se crea un puntero de estructura*/ p=&empleado;
  • 33. Ejemplo 10 9 10.9 En este ejemplo se declara el tipo estructura t_persona, que se asocia con el tipo persona para facilidad de escritura Un array de esta estructura escritura. se inicializa con campos al azar y se muestran por pantalla
  • 34. Ejercicios Escribir un programa en que se lean 20 líneas de texto, cada línea con un máximo d 80 caracteres. M á i de Mostrar por pantalla el numero d ll l de vocales que tiene cada línea Se requiere evaluar las funciones f(x), g(x) y z(x) para todos los valores de x en el intervalo 0<=x<=3.5 con incrementos de 0.2. escribir un programa que evalué dichas funciones, utilizar un array de punteros a función. Las funciones son las siguientes; F(x)=3*ex-2x G(x)=-x*Sin(x)+1.5 ( ) ( ) Z(x)=x3-2x+1
  • 35. Patrón de prueba de pantalla panorámica (16:9) Prueba de la relación de aspecto (Debe parecer circular) 4x3 16x9