PUNTEROS (Apuntadores) - Vanessa Borjas · punteros hacen más rápido el trabajo de los arrays....

27
LOGO PUNTEROS (Apuntadores) Unidad III

Transcript of PUNTEROS (Apuntadores) - Vanessa Borjas · punteros hacen más rápido el trabajo de los arrays....

LOGO

PUNTEROS (Apuntadores)

Unidad III

LOGO

INTRODUCCIÓN A

PUNTEROS.

CONCEPTOS BÁSICOS.

DECLARACIÓN DE

PUNTEROS.

LOGO

PUNTEROS

Como una colección de posiciones de

memoria consecutivas . En ella se

almacenan los distintos tipos de

datos, que ocupan, por ejemplo:

1 char = 1 byte

1 int = 2 bytes

1 float = 4 bytes

75

0x4fffd34

n

int

¿Cómo se organiza la memoria asociada a un programa?

Atributos fundamentales

asociados a la declaración de

una variable

LOGO

PUNTEROS

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

LOGO DIRECCIONES Y REFERENCIAS

&: me da la dirección de un objeto en la memoria.

Sólo sirve para posiciones de memoria (puede apuntar a variables o a vectores, pero no a constantes o expresiones).

Al valor de una variable se accede por medio de su nombre.

A la dirección de una variable se accede por medio del “operador de dirección &”

Ejemplo: para imprimir la dirección de n: cout << &n;

LOGO

Ejemplo:

Obtener el valor y la dirección de una variable.

void main() { int n = 75; printf(“n = %d \n\n”, n); // Visualiza el valor de n printf(“&n = %p \n\n”, &n); // Visualiza la dirección de n }

Ejecución:

n = 75 &n = 0x4fffd34

DIRECCIONES Y REFERENCIAS

LOGO

PUNTEROS

REGLAS BÁSICAS DE

PUNTEROS:

• 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.

75

p

El valor de un puntero es una dirección. La

dirección depende del estado de la

computadora en la cual se ejecuta el

programa

Puntero: Tipo de variable que almacena una dirección.

LOGO

PUNTEROS

A

101

100

99

1001

1000

999

p contiene el valor 100, que es

la dirección de alfa.

*p es el valor del elemento al

que apunta p. Por consiguiente,

*p toma el valor ‘A’.

Dirección de

memoria alta

Dirección de

memoria baja Relaciones entre *p y el valor

de p (dirección de alfa)

alpha

p

LOGO

DECLARACIÓN DE PUNTEROS

TIPO * nombre_puntero ;

Donde TIPO es cualquier tipo definido. Así, un puntero a caracter se

declararía de la siguiente forma:

char *pchar;

Diferencia entre “*” y “&”:

En C se puede obtener directamente

la dirección de memoria de cualquier

variable. Esto es posible hacerlo con

el operador unario “&” así:

char a; /* Variable a de tipo char */

printf(“La dirección de memoria de

‘a’ es: %p \n”, &a);

Y para obtener lo apuntado por un puntero se

utiliza el operador unario “*” de esta forma:

char a; /* Variable a de tipo char */

char *pchar; /* Puntero a char ‘pchar’ */

pchar = &a; /* ‘pchar’ <- @ de ‘a’ */

printf(“La dirección de memoria de ‘a’ es: %p

\n”, &a);

printf(“Y su contenido es: %c \n”, *pchar);

LOGO

PUNTEROS

Ejercicio:

Ejecución:

N = 75, &n = 0x4fffd34, p = 0x4fffd34

&p = 0x4fffd10

0x4fffd34

0x4fffd30

p

75

0x4fffd34

n

Int*

Int

void main()

{

int n = 75;

int *p = &n;

printf("n = %d \n",n); //con el nombre de la variable se puede obtener si valor

printf("&n = %p \n",&n); //con el operador de referencia & se obtiene la dirección de memoria de n

printf("&n = %p \n",p); //p contiene la dirección de memoria donde esta n

printf("&p = %p \n\n",&p); //con el operador de referencia se obtiene la dirección de memoria de p

printf("n = %d \n\n",*p); // *p permite obtener el datos guardado en la variable apuntada n

system("pause");

}

LOGO

PASO DE

PUNTEROS A UNA

FUNCIÓN

LOGO PASO DE PUNTEROS A UNA FUNCIÓN

• En C, el método normal de pasar argumentos a

funciones es a través de parámetros por valor.

• Cuando se pasa un argumento como un valor a una función, se hace una copia del elemento de dato dentro de la función.

• Dentro de la función, todas las referencias a los argumentos a través de los parámetros formales son dirigidos a la copia.

• De manera que, si se modifica este elemento de dato, es la copia dentro de la función la que es modificada y no la usada en la llamada.

LOGO PASO DE PUNTEROS A UNA FUNCIÓN

LOGO PASO DE PUNTEROS A UNA FUNCIÓN

Los Punteros

permiten representar el paso de parámetros

de una función por referencia.

Cuando un puntero se usa como argumento, ofrece el acceso y la capacidad de alterar

las variables globalmente desde

alguna función.

LOGO PASO DE PUNTEROS A UNA FUNCIÓN

Ejercicio: Intercambiar los valores de “a” y “b”.

Incorrecto

LOGO PASO DE PUNTEROS A UNA FUNCIÓN

Ejercicio: Intercambiar los valores de “a” y “b”.

Correcto

LOGO PUNTEROS: Reglas de uso.

• El símbolo * se usa para DEFINIR un tipo puntero. • El símbolo & se usa para indicar la dirección de una

variable. • El símbolo * se usa para ACCEDER al valor de un

puntero. • El símbolo & se usa en la invocación de funciones, de

forma que se coloca delante de los parámetros de E/S. • Cuando un parámetro es de E/S en el prototipo y cabecera

se indica con un tipo puntero, esto es, colocando un * delante del nombre.

• En el cuerpo de la función, los argumentos que son funciones se USAN con un * delante.

• Los & sólo se usan en el programa principal. • Los * sólo se usan en las funciones.

LOGO

PUNTEROS Y

ARRAYS

UNIDIMENSIONALES

LOGO ARRAYS UNIDIMENSIONALES

¿Qué es un Array

(Arreglo)?

Es una colección de datos del

mismo tipo que se referencian

por un mismo nombre, sus

elementos se distinguen entre

sí, por índices o direcciones de

memoria.

¿Cómo acceder a un

elemento de un Array?

A un elemento específico de

un arreglo se accede

mediante índices o su

dirección de memoria. La

dirección más baja

corresponde al primer

elemento y la dirección más

alta al último elemento.

LOGO

0 1 2 3 4 5 6 7 8 9

EF00 EF02 EF04 EF06 EF08 EF10 EF12 EF14 EF18 EF20

Un arreglo unidimensional es una colección de datos del mismo tipo

almacenados en posiciones contiguas de memoria.

Declaración: tipo nombre_arreglo[tamaño] ;

Donde:

• tipo: declara el tipo del arreglo, que es el tipo de cada elemento del mismo.

• nombre_arreglo: es el nombre del arreglo.

• tamaño: es el número de elementos del arreglo.

Ejemplo:

int lista[10]; //Declara un arreglo lista con 10 elementos de tipo int.

ARRAYS UNIDIMENSIONALES

30 15 27 39 43 51 66 25 84 18 lista

Dirección memoria

Elementos

Índice

LOGO ARRAYS UNIDIMENSIONALES

0 1 2 3 4 5 6 7 8 9

EF00 EF02 EF04 EF06 EF08 EF10 EF12 EF14 EF18 EF20

30 15 27 39 43 51 66 25 84 18 lista

Dirección memoria

Elementos

Índice

Índice:

Identifica la posición del elemento en el arreglo. También se le

conoce como subíndice. Deben ser enteros: constantes, variables o

expresiones. El primer valor comienza generalmente por 0.

Los elementos del arreglo lista del ejemplo serían:

Lista[0] = 30 primer elemento del arreglo

Lista[1] = 15 segundo elemento del arreglo

…….. ….

Lista[9] = 18 último elemento del arreglo

LOGO

• La declaración de los arreglos puede ser de cualquier tipo de datos.

Por ejemplo:

int patos[22]; /*arreglo de 22 enteros*/

char alfabeto[26]; /*arreglo de 26 caracteres*/

long int grados [500]; /*arreglo de 500 enteros largos*/

• También se pueden usar constantes para la declaración de un

arreglo. Ejemplos:

#define TAM 15

int a[TAM];

char b[TAM+1];

float c[TAM-1];

• La cantidad de memoria necesaria para almacenar un arreglo está

directamente relacionada con el tamaño y el tipo del arreglo.

Total_bytes=sizeof(tipo)*tamaño

ARRAYS UNIDIMENSIONALES

LOGO ARRAYS UNIDIMENSIONALES

Inicialización de Arrays:

• Los arrays se inicializan en el momento de declararlos.

• La forma general de inicialización de un array es similar a la de otras

“variables”, así:

tipo nombre_array[tamaño] = {lista_valores};

donde: lista_valores es una lista de constantes separadas por

comas, cuyo tipo es compatible con tipo.

Ejemplo: int lista[10] = {34,15,7,9,3,11,6,25,4,18};

• La primera constante se coloca en la primera posición del array, la

segunda constante se coloca en la segunda posición, y así

sucesivamente.

LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES

Los programas que utilizan punteros son más eficientes porque

los punteros usan directamente las direcciones de

memoria.

En particular, los punteros hacen más rápido el trabajo de los arrays. Entonces,

la notación con arrays es un método

disfrazado de empleo de punteros.

El nombre de un array sin índice y sin corchetes es un puntero dirigido al primer elemento del array…

LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES

Por ejemplo, con las siguientes declaraciones:

int meses[12];

int *p;

• Se puede generar un puntero al primer elemento, usando el nombre del

array meses así:

p=meses;

Por lo tanto, se cumple que:

p==&meses[0]

• Es cierto, y los punteros meses y &meses[0] representan la dirección de

memoria del primer elemento del array.

• Además, los punteros meses y &meses[0] son constantes y no pueden

cambiar su valor a lo largo del programa, porque indican dónde comienza a

almacenarse el array. Sin embargo, pueden ser asignados a una “variable

puntero” como p.

LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES

El lenguaje C proporciona dos métodos de acceso a elementos de arrays, que son:

Aritmética de punteros

Indexación del array

ÍNDICES

PUNTEROS

Con el array meses Con el puntero p

Primer elemento

meses[0] *meses *p

Segundo elemento

meses[1]

*(meses+1) *(p+1)

Tercer elemento

meses[2]

*(meses+2) *(p+2)

… … … …

Duodécimo elemento

meses[11]

*(meses+11) *(p+11)

LOGO

Ejercicio:

PUNTEROS Y ARRAYS UNIDIMENSIONALES