35
Evaluación escrita Evaluación escrita Indique como se realiza la declaración y la Indique como se realiza la declaración y la llamada a una función Indique como se declara y asigna valores a un Indique como se declara y asigna valores a un array Describa las ventajas de usar estructuras y como se declaran

PUNTEROS (APUNTADORES) EN C++

  • Upload
    diedex

  • View
    25.459

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PUNTEROS (APUNTADORES) EN C++

Evaluación escrita Evaluación escrita

Indique como se realiza la declaración y laIndique como se realiza la declaración y lallamada a una funciónIndique como se declara y asigna valores a unIndique como se declara y asigna valores a unarrayDescriba las ventajas de usar estructuras y como sedeclaran

Page 2: PUNTEROS (APUNTADORES) EN C++

Ejercicios Ejercicios

Elabore un programa que lea una cadena de 50Elabore un programa que lea una cadena de 50caracteres y convierta las vocales en mayúsculasElabore un programa que obtenga el determinanteElabore un programa que obtenga el determinantede una matriz 3x3 ingresada por el usuario

Page 3: PUNTEROS (APUNTADORES) EN C++

PUNTEROSPUNTEROS(APUNTADORES)( )Sugerencias y herramientas para crear para crear y presentar diapositivas en formato panorámico

Page 4: PUNTEROS (APUNTADORES) EN C++

Contenido Contenido Direcciones en memoria Aritmética de punterosConcepto de puntero (apuntador)P t ll id

pPunteros constantes frente a punteros a constantes

Puntero null y voidPunteros a punterosPunteros a Arrays

Punteros como argumento de funcionesPunteros a funcionesPunteros a Arrays

Arrays de punterosPunteros a cadenas

Punteros a funcionesPunteros a estructurasEjercicios Punteros a cadenas j

Page 5: PUNTEROS (APUNTADORES) EN C++

Dirección de memoria Dirección de memoria Cuando una variable se declara, se asocian tres,atributos fundamentales con la misma: su nombre, sutipo y su dirección de memoria

Int n;Asocia al nombre n, el tipo int y la dirección de algunap y gposición de memoria donde se almacena el valor de n

Page 6: PUNTEROS (APUNTADORES) EN C++

ContCont…Al valor de la variable se accede por medio de supnombre. Por ejemplo, se puede imprimir el valor de ncon la sentencia;

Printf (“%d”,n);A la dirección de la variable se accede por medio deloperador de dirección &. Por ejemplo, se puedeimprimir la dirección de n con la sentencia:

P i tf (“% ” & )Printf (“%p”,&n);

Page 7: PUNTEROS (APUNTADORES) EN C++

Ejemplo 10 1 Ejemplo 10.1 Obtener el valor y la dirección de una variable

# l d d h#include <stdio.h>#include <stdlib.h>int main (){{

int n=75;printf("n=%d\n",n);printf("&n=%p\n" &n);printf( &n=%p\n ,&n);system("pause");return 0;}}

Page 8: PUNTEROS (APUNTADORES) EN C++

Concepto de puntero (apuntador)Concepto de puntero (apuntador)Un puntero es una variable que contiene una dirección de memoriaEl tipo de variable que almacena una dirección se denomina punteroLos punteros se rigen por estas reglas básicas:

Un puntero es una variable como cualquier otra;Un puntero es una variable como cualquier otra;Una variable puntero contiene una dirección que apunta a otra posiciónen memoriaEn esa posición se almacenan los datos a los que apunta el punteroEn esa posición se almacenan los datos a los que apunta el punteroUn puntero apunta a una variable de memoria

Page 9: PUNTEROS (APUNTADORES) EN C++

Ejemplo 10 2 Ejemplo 10.2 #include <stdio.h>#i l d < dlib h>#include <stdlib.h>int main (){

i 75int n=75;int*p=&n;printf("n=%d, &n=%p, p=%p\n",n,&n,p);

i tf("& % \ " & )printf("&p=%p\n",&p);system("PAUSE");return 0;

}}

Page 10: PUNTEROS (APUNTADORES) EN C++

Declaración de punteros Declaración de punteros Al igual que cualquier variable, las variables punterosg q q , phan de ser declaradas antes de utilizarlas. Ladeclaración de una variable puntero debe indicar alcompilador el tipo de dato al que apunta el puntero;para ello se hace preceder a su nombre con unasterisco (*)asterisco (*)<tipo de dato apuntado>*<identificador de puntero>Fl t*fFloat*f;

Page 11: PUNTEROS (APUNTADORES) EN C++

Inicialización de punteros Inicialización de punteros La inicialización de un puntero proporciona a ese puntero ladirección del dato correspondiente. Para asignar unadirección de memoria a un puntero se utiliza el operador dereferencia &.&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 un valor a la dirección de memoria /

Page 12: PUNTEROS (APUNTADORES) EN C++

Indireccion de punterosIndireccion de punteros

El uso de un puntero #include <stdio.h>

#include <stdlib h>El uso de un puntero para obtener el valor al que apunta es decir

#include <stdlib.h>

char c;

int main()

{al que apunta, es decir, su dato apuntado se denomina indireccionar

char *pc;

pc=&c;

for(c='A';c<='Z';c++)

printf("%c",*pc);denomina indireccionarel puntero

printf("\n");

system("pause");

return 0;

}}

Page 13: PUNTEROS (APUNTADORES) EN C++

Punteros null y voidPunteros null y voidUn puntero nulo no apunta a ninguna parte, no direcciona ningún dato

lid ivalido en memoria#define NULL 0

Otra forma de declarar un puntero nulo es asignar un valor de 0Int *ptr=0;

Los punteros nulos se utilizan con frecuencia en programas con arrays depunterosEn C se puede declarar un puntero de modo que apunte a cualquier tipode dato, es decir, no se asigna a un tipo de dato especifico. El método esdeclarar el puntero como puntero void* denominado puntero genérico

Void *prt

Page 14: PUNTEROS (APUNTADORES) EN C++

Punteros a punteros Punteros a punteros Un puntero puede apuntar a otra variable puntero. EsteUn puntero puede apuntar a otra variable puntero. Esteconcepto se utiliza con mucha frecuencia en programascomplejos de C. para declarar un puntero a un punterop j p p pse hace preceder a la variable con dos asteriscos (**)

Int valor e=100;_ ;Int *ptr1=&valor_e;Int **ptr5=&ptr1;Int ptr5 &ptr1;

Page 15: PUNTEROS (APUNTADORES) EN C++

Punteros y ArraysPunteros y ArraysSe pueden direccionar arrays como si fueranp ypunteros y punteros como si fueran arrays. Laposibilidad de almacenar y acceder a punteros yarrays, implica que se pueden almacenar cadenasde datos en elementos de arrays. Sin punteros esono es posible, ya que no existe el tipo de datocadena en C. no existen variables de cadena,ú i d dúnicamente constantes de cadena

Page 16: PUNTEROS (APUNTADORES) EN C++

Nombres de arrays como punterosNombres de arrays como punterosUn nombre de un array es simplemente un puntero.Supongamos que se tiene la siguiente declaración de unarray:In lista[5]={10 20 30 40 50}In lista[5]={10,20,30,40,50}Si se manda a visualizar lista[0] se vera 10 y si se manda avisualizar *lista. Como un nombre de un array es un puntero,

0también se vera 10Dado que un nombre de un array contiene la dirección delprimer elemento del array se debe indireccionar el punteroprimer elemento del array, se debe indireccionar el punteropara obtener el valor del elemento

Page 17: PUNTEROS (APUNTADORES) EN C++

Arrays de punterosArrays de punterosSi se necesita reservar muchos punteros a muchospvalores diferentes, se puede declara un array depunteros. Un array de punteros es un array quecontiene como elementos punteros, cada uno de loscuales apunta a un tipo de dato especifico. La lineasiguiente reserva un array de diez variables puntero asiguiente reserva un array de diez variables puntero aenteros:Int *ptr[10];Int ptr[10];

Page 18: PUNTEROS (APUNTADORES) EN C++

Inicialización de un array de punteros a cadenas Inicialización de un array de punteros a cadenas

La inicialización de un array de punteros a cadenasLa inicialización de un array de punteros a cadenasse puede realizar con una declaración similar aesta;esta;Char* b [12]={“ ” ”f b ” ” ” ”*nombres_meses[12]={“enero”,”febrero”,”marzo”,”abril”,”mayo”,”junio”,”julio”,”agosto”,”septiembre”,”

b ” ” i b ” ”di i b ”}octubre”,”noviembre”,”diciembre”};

Page 19: PUNTEROS (APUNTADORES) EN C++

Punteros de cadenas Punteros de cadenas Los punteros se pueden utilizar en lugar de índicesp p gde arrays. Considérese la siguiente declaración deun array de caracteres que contiene las letras delalfabeto;Char alfabeto[27]=“ABCDE….z”;[ ] ;P=&alfabeto[0]Printf(“%c\n” *p);Printf( %c\n , p);

Page 20: PUNTEROS (APUNTADORES) EN C++

Aritmética de punteros Aritmética de punteros Al contrario que un nombre de un array, que es un puntero constante y no

d difi t i bl d difise puede modificar, un puntero es una variable que se puede modificar.Como consecuencia, se pueden realizar ciertas operaciones aritméticassobre punterosA un puntero se le puede sumar o restar un entero n; esto hace que apunteA un puntero se le puede sumar o restar un entero n; esto hace que apunten 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 m[20];Float *r;r=m;r++r++

Page 21: PUNTEROS (APUNTADORES) EN C++

Ejemplo conversión de caracteres 10 8Ejemplo conversión de caracteres 10.8

Convierte caracteres de minúsculas a mayúsculas Convierte caracteres de minúsculas a mayúsculas

Page 22: PUNTEROS (APUNTADORES) EN C++

Punteros constantes frente a punteros a constantes Punteros constantes frente a punteros a constantes

Un puntero constante es un puntero que no se puedeUn puntero constante es un puntero que no se puedecambiar, pero que los datos apuntados por elpuntero pueden ser cambiados Por otra parte unpuntero pueden ser cambiados. Por otra parte, unpuntero a una constante se puede modificar paraapuntar a una constante diferente pero los datosapuntar a una constante diferente, pero los datosapuntados por el puntero no se pueden cambiar

Page 23: PUNTEROS (APUNTADORES) EN C++

Punteros constantes 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>;variable>;Int x;Int y;y;Int *const p1=&x;*p1=y, es legal ya que se cambia el contenido de memoriap1=&y , no es legal ya que se cambia el valor del puntero

Page 24: PUNTEROS (APUNTADORES) EN C++

Punteros a constantes 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* 1 15 d il ió *p1=15, crea un error de compilación

Page 25: PUNTEROS (APUNTADORES) EN C++

Punteros constantes a constantes Punteros constantes a constantes El ultimo caso a considerar es crear punteros constantesa constantes utilizando el formato siguiente;

Const <tipo de dato elemento> *const <nombrepuntero>=<direccion de constante>;puntero>=<direccion de constante>;Const int x=25;Const int *const p1=&x;p ;P1 es un entero constante que apunta a una constanteentera x, cualquier intento de modificar p1 o bien *p1producirá un errorproducirá un error

Page 26: PUNTEROS (APUNTADORES) EN C++

Punteros como argumentos de funciones 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 (pasopor dirección) se puede cambiar el valor de la variablep ) p

Void func1 (int *s, int t) int i, j;{ i=5;* 6 j 7*s=6; j=7;t=25; func1 (&i, j);}}

Page 27: PUNTEROS (APUNTADORES) EN C++

Punteros a funciones Punteros a funciones Es posible crear punteros que apunten a funciones. En lugarp p q p gde direccionar datos, los punteros de funciones apuntan acódigo ejecutable. Al igual que los datos, las funciones sealmacenan en memoria y tienen direcciones iniciales En C sealmacenan en memoria y tienen direcciones iniciales. En C sepueden asignar las direcciones iniciales de funciones apunteros. Tales funciones se pueden llamar en un modop pindirecto, es decir mediante un puntero cuyo valor es igual ala dirección inicial de la función en cuestión

Ti d (* F i ) ( li d )Tipo_de_retorno (*punteroFuncion) (<lista de parametros>);

Page 28: PUNTEROS (APUNTADORES) EN C++

ContCont…Un puntero a una función es simplemente un puntero cuyop p p yvalor es la dirección del nombre de la función. Dado que elnombre es, en si mismo, un puntero; un puntero a una funciónes un puntero a un puntero constantees un puntero a un puntero constante

Page 29: PUNTEROS (APUNTADORES) EN C++

Inicialización de un puntero a una funciónInicialización de un puntero a una funciónLa 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*/double calculo (int*v; unsigned n); /*prototipo de funció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*/=qf(r 5) /*llamada a la f nción con el p ntero a f nción*/x=qf(r,5); /*llamada a la función con el puntero a función*/

Page 30: PUNTEROS (APUNTADORES) EN C++

Ejemplo 10 6Ejemplo 10.6

Se desea ordenar un array de numero reales, la Se desea ordenar un array de numero reales, la ordenación se va a realizar con la función qsort()

Page 31: PUNTEROS (APUNTADORES) EN C++

Arrays de punteros de funciones Arrays de punteros de funciones

Ciertas aplicaciones requieren disponer de numerosasp q pfunciones, basadas en el cumplimiento de ciertascondiciones. Un método para implementar tal aplicación esutilizar una sentencia switch con muchos selectores caseutilizar una sentencia switch con muchos selectores case.Otra solución es utilizar un array de punteros de función. Sepuede seleccionar una función de la lista y llamarlap yLa sintaxis general de un array de punteros de función es:

tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)

Page 32: PUNTEROS (APUNTADORES) EN C++

Punteros a estructuras Punteros a estructuras Un puntero también puede apuntar a una estructura. Sep p ppuede declarar un puntero a una estructura tal como sedeclara un puntero a cualquier otro objeto y se declaraun puntero estructura tal como se declara cualquier otravariable estructura: especificando un puntero en lugardel nombre de la variable estructuradel nombre de la variable estructura

Strcuct persona *p; /*se crea un puntero de estructura*/p=&empleado;p=&empleado;

Page 33: PUNTEROS (APUNTADORES) EN C++

Ejemplo 10 9Ejemplo 10.9

En este ejemplo se declara el tipo estructuraEn este ejemplo se declara el tipo estructurat_persona, que se asocia con el tipo persona parafacilidad de escritura Un array de esta estructurafacilidad de escritura. Un array de esta estructurase inicializa con campos al azar y se muestran porpantallapantalla

Page 34: PUNTEROS (APUNTADORES) EN C++

Ejercicios Ejercicios Escribir un programa en que se lean 20 líneas de texto, cada línea

á i d 80 M ll l dcon un máximo de 80 caracteres. Mostrar por pantalla el numero devocales que tiene cada líneaSe requiere evaluar las funciones f(x), g(x) y z(x) para todos losvalores de x en el intervalo 0<=x<=3.5 con incrementos de 0.2.escribir un programa que evalué dichas funciones, utilizar un arrayde punteros a función.

Las funciones son las siguientes;F(x)=3*ex-2xG(x)=-x*Sin(x)+1.5( ) ( )Z(x)=x3-2x+1

Page 35: PUNTEROS (APUNTADORES) EN C++

Patrón de prueba de pantalla panorámica (16:9)

Prueba de la relación de

aspecto

(Debe parecer circular)

16x9

4x3