Вы находитесь на странице: 1из 5

INSTITUTO TECNOLOGICO DEL PUTUMAYO

FACULTAD DE INGENIERA Y CIENCIAS BSICAS


PROGRAMA INGENIERA DE SISTEMAS POR CICLOS

Taller N. 1
CODIGO: PYS303
Aplicacin a los apuntadores y gestin de memoria dinmica utilizando estructura.

Para estudiantes de: Tercer Semestre de Tecnologa en Desarrollo de Software LAB. TICs ENSAMBLE Y
MANTENIMIENTO
ESPACIO ACADMICO: PYS303 ESTRUCTURAS DE DATOS
CIUDAD Y FECHA: Mocoa Agosto 10 de 2017 VERSIN 01

OBJETIVOS

INTEGRANTES

PARA RECORDAR

http://www.it.uc3m.es/abel/as/DSP/M2/Pointers_es.html

https://www.youtube.com/watch?v=3GO-KckDmiM

https://www.taringa.net/posts/info/17200607/La-complicada-relacion-entre-arreglos-y-punteros.html

http://sopa.dis.ulpgc.es/fso/cpp/intro_c/introc71.htm

BASE CONCEPTUAL

PUNTERO: o apuntador. Es una variable que contiene la direccin de memoria de un dato o de otra variable que
contiene al dato en un arreglo. Dicho de otra forma, un puntero apunta al espacio fsico donde est el dato o la
variable.

Un puntero puede apuntar a:

Un objeto: Estructura o Funcin


Un tipo de dato.

Los punteros se pueden utilizar para:

Referencia y manipular estructuras de datos.


Referenciar bloques de memoria asignados dinamicamente.
Proveer el paso de argumentos por referencias en las llamadas a funciones.

Sintaxis:

<tipoDato> *<nombreVariable>;
NOTA: C permite declarar un puntero genrico de tipo void *. Una variable de este tipo almacena un puntero a
cualquier dato. Se recomienda utilizar este tipo de datos slo cuando sea estrictamente necesario.

El tamao de los punteros es siempre el mismo independientemente del dato al que apuntan porque todos
ellos almacenan una direccin de memoria. Para las estructuras de datos, la regla se aplica de forma idntica.
El siguiente ejemplo muestra la definicin de una estructura y la declaracin de una variable de tipo estructura
y otra de tipo puntero a esa estructura:

La variable contact1 es de tipo estructura y ocupa 44 bytes (20 + 20 + 4), mientras que contactPointer es de tipo
puntero y ocupa 4 bytes.

Operadores:

*<nombreVariable> : Permite acceder al contenido


&<nombreVariable> : Retorna la direccin en memoria. Address-of

De esta manera,

int a;
int *puntero=&a;
printf("%d",a); Es Igual printf("%d",*puntero);

PASO DE PARMETROS A FUNCIONES: En la mayora de los lenguajes hay dos formas de pasar las variables a
una funcin, por valor o por referencia.
Por valor significa que la funcin (o subrutina) recibe slo una copia del valor que tiene la variable, o sea que
no la puede modificar.

Sintaxis:

<tipoRetorno> <nombreSubrutina> (<tipoDato> <nombreParmetro>[,<tipoDato> <nombreParmetro>...])

Por referencia significa que se pasa la posicin de memoria donde esta guardada la variable, por lo que la
funcin puede saber cunto vale, pero adems puede modificarla de cualquier manera.

Sintaxis:

<tipoRetorno> <nombreSubrutina> (<tipoDato> &<nombreParmetro>[,<tipoDato> <nombreParmetro>])

En la invocacin de una funcin sin retorno

<nombreSubrutina> (&<nombreParmetro>);

En la subrutina

<tipoRetorno> <nombreSubrutina> (<tipoDato> *<nombreParmetro>[,<tipoDato> <nombreParmetro>])

Nota: En la subrutina deben manipularse los valores con el operador *

REGLAS DE USO DE PUNTEROS

1. El operador * se utiliza para definir un tipo puntero


2. El operador & se usa para indicar la direccin en memoria de una variable.
3. El operador * se utiliza para acceder al valor del puntero
4. El simbolo & se usa para INVOCAR subrutinas .
5. Cuando un parmetro es de Entrada/Salida, en el prototipo y cabecera se indica con un tipo puntero utilizando el
operador * antes del nombre del parmetro.
6. En el mbito de una subrutina para la que se definieron parmetros tipo puntero, se hace uso de los parmetros
con el operador *
7. En la funcin principal se usan los &
8. El operador * slo se usa en las funciones

CUNDO UTILIZAR APUNTADORES

1. Cuando una subrutina devuelve ms de un valor


2. Desreferenciacin: Asignar un valor a una variable mediante su puntero.
P.E
int a = 20;
int *p = &a;
*p = 20;
Nota: Los punteros VOID que pueden apuntar a cualquier tipo no pueden ser desreferenciados.
3. Cuando se debe manipuar datos con precisin mejorando el uso de la memoria
4. Modificar de manera dinmica una estructura, sin necesidad de declarar variables de manera repetida.

ARITMTICA DE PUNTEROS

Debido a que un puntero apunta a una direccin de memoria, el lenguaje C permite sumar o restar cantidades
enteras al puntero, para que apunte a una direccin diferente a esto se le conoce como aritmtica de punteros .

Consideremos un puntero a enteros:

int* ptr;

ptr apuntar a cierta direccin de memoria, por lo que tendrn sentido las expresiones ptr+1, ptr+2, etc. La expresin
ptr+k es un puntero que apunta a la direccin de ptr sumndole k veces el espacio ocupado por un elemento del tipo al
que apunta (en este caso un int). EN conclusin, a un puntero se le puede aplicar cualquier clase de operacin de
suma o resta (incluyendo los incrementos y decrementos).

ARREGLOS Y PUNTEROS

Un arreglo es una variable que contiene uno o ms elementos. La direccin del arreglo es la misma que la de su primer
elemento

Considere un puntero y un arreglo unidimensional

int *p;
int arreglo[10];
p = arreglo;

*arreglo = 4 es similar a arreglo[0] = 4

Los arreglos pueden manipularse con punteros y viceversa, en el caso del ejemplo, el puntero p apunta a la primera
posicin del bloque de memoria que se separ para almacenar los datos del arreglo.

La diferencia entre punteros y arreglos radica en que el compilador almacena informacin adicional de los arreglos por
lo que los tamaos de p y arreglo seran difentes.

CUESTIONARIO

1. Declare dos variables de tipo entero y asigneles un valor. Imprima los valores de cada variable. Imprima la direccin
en memoria de cada variable.

2. Declare dos variables de tipo entero y asigneles un valor. Implemente una funcin que permita intercambiar los
valores de las dos variables. Esta funcin debe invocarse desde la funcin principal.

Void intercambio (int x, int y){


int z;
z = x;
x = y;
y= z;

Imprima los resultados obtenidos y explique qu ocurre y qu modificacin debe hacerse en la funcin realice el
procedimiento de intercambio de la manera esperada. Qe modificacin debe realizarse en la invocacin de la funcin.

3. Incluya en la funcin intercambio las sentencias necesarias para imprimir las direcciones en memoria de las variables
que se pasan como parmetros.

4. Implemente un algoritmo que:


Cree un arreglo unidimensional de n posiciones y lo llene con nmeros del 0 al 9
Invoque internamente una funcin que retorne el nmero mximo en el arreglo y su posicin.

5. Implemete un algoritmo en el que declare cuatro variables de diferente tipo cada una. Utilizando la funcin
sizeof(<nombreVariable>); imprima el tamao en memoria de la variable. Cree cuatro apuntadores de cuatro tipos
difenerntes e imprima el tamao en memoria de estos.

Nota: Recuerde que, cada vez que se crea una nueva variable, se separa en memoria espacio para esta dependiendo
del tamao necesario para almacenarla segn el tipo. Este espacio en memoria es contguo

Cul es el resultado en cada caso?. Por qu cree que sucede esto?

6. Declare una variable tipo entero e inicialicela, y un puntero que apunte a la direccin de esta. Imprima el valor de la
variable entera y del puntero. Asigne a la variable entera un nuevo valor utilizando el puntero que se creo para esta.
Imprima el valor de la variable. Cmo se llama el procedimiento efectuado?

7. Declare cuatro variables de diferente tipo cada una. Declare un nico puntero y con este acceda a cada variable e
imprima su valor.

8. Declare dos variables, una tipo char y otra tipo int. Declare un puntero para cada tipo de variable. Incremente cada
puntero en 1 e imprima su la direccin en memoria a la que apunta cada puntero antes y despus del incremento. Qu
sucede y por qu?.

9 Declare un puntero tipo int y un arreglo de enteros de 20 posiciones. Coloque el puntero a apuntar al arreglo e imprima
el tamao del arreglo y del puntero utilizando la funcin sizeof() para el puntero y bsizeof() para el arreglo. Por qu cree
que existe diferencia en los resultados?

10. Cree una cadena de caracteres utilizando un arreglo y coloque un apuntador al unucio del arreglo. Imprima cada uno
de los caracteres accediendo al apuntador como lo hara con un arreglo.

Вам также может понравиться