SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
República Bolivariana de Venezuela
Ministerio del Poder Popular Para La Defensa
Universidad Nacional Experimental Politécnica De Las Fuerzas Armadas
UNEFA –Yaracuy
Extensión Nirgua

Profesor:
Luis Sequera
Integrante:
Luis Hernández
Programación I

Apuntadores Y Direcciones De Memoria
Punteros Y Direccionamiento De Memoria

Un puntero

es una variable que contiene una dirección de memoria.

Normalmente, esa dirección es la posición de otra variable de memoria. Si una variable
contiene la dirección de otra variable, entonces se dice que la primera variable apunta a
la segunda.

Si una variable va a contener un puntero, entonces tiene que declararse como tal.
Una declaración de un puntero consiste en un tipo base, un * y el nombre de la variable.
La forma general es: tipo *nombre;

Donde tipo es cualquier tipo válido y nombre es el nombre de la variable
puntero. El tipo base del puntero define el tipo de variables a las que puede apuntar.
Técnicamente, cualquier tipo de puntero puede apuntar a cualquier dirección de la
memoria, sin embargo, toda la aritmética de punteros esta hecha en relación a sus tipos
base, por lo que es importante declarar correctamente el puntero.

Existen dos operadores especiales de punteros: & y *. El operador de dirección
(&) devuelve la dirección de memoria de su operando. El operador de indirección (*)
devuelve el contenido de la dirección apuntada por el operando.

Después de declarar un puntero, pero antes de asignarle un valor, éste contiene
un valor desconocido; si en ese instante lo intenta utilizar, probablemente se estrellará,
no sólo el programa sino también el sistema operativo. Por convenio, se debe asignar el
valor nulo a un puntero que no este apuntando a ningún sitio, aunque ésto tampoco es
seguro.

Apuntadores Y Direcciones De Memoria
Asignación de punteros

Como en el caso de cualquier otra variable, un puntero puede utilizarse a la
derecha de una declaración de asignación para asignar su valor a otro puntero. Por

Ejemplo:

int x;
int *p1,*p2;
p1=&x;

p2=p1;
Tanto p1 como p2 apuntan a x.

Aritmética de Punteros

Existen sólo dos operaciones aritméticas que se puedan usar con punteros: la
suma y la resta.

Cada vez que se incrementa un puntero, apunta a la posición de memoria del
siguiente elemento de su tipo base. Cada vez que se decrementa, apunta a la posición
del elemento anterior. Con punteros a caracteres parece una aritmética normal, sin
embargo,el resto de los punteros aumentan o decrecen la longitud del tipo de datos a los
que apuntan.

Por ejemplo, si asumimos que los enteros son de dos bytes de longitud y p1 es
un puntero a entero con valor actual 2000. Entonces, después de la expresión p1++; p1
contiene el valor 2002, no 2001.

No pueden realizarse otras operaciones aritméticas sobre los punteros más allá
de la suma y resta de un puntero y un entero. En particular, no se pueden multiplicar o
dividir punteros y no se puede sumar o restar el tipo float o el tipo double a los punteros.

Apuntadores Y Direcciones De Memoria
Punteros Y Arrays

Existe una estrecha relación entre los punteros y los arrays. Considérese el
siguiente fragmento:
char cad[80], *p1;
p1=cad;

Aquí, p1 ha sido asignado a la dirección del primer elemento del array cad. Para
acceder al quinto elemento de cad se escribe cad[4] o *(p1+4).
Un nombre de array sin índice devuelve la dirección de comienzo del array, que
es el primer elemento. El compilador traduce la notación de arrays en notación de
punteros.

Es decir, al crear un array se genera un puntero (en realidad una constante de
puntero) con el mismo nombre que apunta a la dirección del primer elemento del array.

Arrays de Punteros

Los punteros pueden estructurarse en arrays como cualquier otro tipo de datos.
La declaración, por ejemplo, para un array de punteros a enteros de tamaño 10 es: int
*x[10];

Para asignar la dirección de una variable entera llamada var al tercer elemento
del array de punteros se escribe:x[2]=&var;

Se puede encontrar el valor de var de la forma: var de la forma: *x[2];Si se
quiere pasar un array de punteros a una función, se puede utilizar el mismo método que
se utiliza para otros arrays: llamar simplemente a la función con el nombre del array sin
índices. Así se pasa el puntero que apunta al array.

No se pasa un puntero a enteros, sino un puntero a un array de punteros a
enteros.

Apuntadores Y Direcciones De Memoria
Indirección Múltiple

Se puede hacer que un puntero apunte a otro puntero que apunte a un valor de
destino. Esta situación se denomina indirección múltiple o punteros a punteros. Una
variable que es puntero a puntero tiene que declararse como tal. Esto se hace colocando
un * adicional en frente del nombre de la variable. Por ejemplo, la siguiente declaración
inicial indica al compilador que ptr es un puntero a puntero de tipo float:float **ptr;

Funciones de Asignación Dinámica

Los punteros proporcionan el soporte necesario para el potente sistema de
asignación dinámica de memoria de C. La asignación dinámica es la forma en la que un
programa puede obtener memoria mientras se está ejecutando.

Como ya se ha visto, a las variables globales se les asigna memoria en tiempo de
compilación y las locales usan la pila. Sin embargo, durante la ejecución no se pueden
añadir variables globales o locales, pero existen ocasiones en las que un programa
necesita usar cantidades de memoria variables.

El centro del sistema de asignación dinámica está compuesto por las funciones
(existentes en la biblioteca stdlib.h) malloc(), que asigna memoria; y free() que la
devuelve.

El prototipo de la función malloc() es: stdlib.h) malloc(), que asigna memoria; y
free() que la devuelve.void *malloc(size_t número de bytes);

Tras una llamada fructífera, malloc() devuelve un puntero, el primer byte de
memoria dispuesta. Si no hay suficiente memoria libre para satisfacer la petición de
malloc(), se da un fallo de asignación y devuelve un nulo. El fragmento de código que
sigue asigna 1000 bytes de memoria:

Apuntadores Y Direcciones De Memoria
char *p;
p = (char *) malloc(1000);

Después de la asignación, p apunta al primero de los 1000 bytes de la memoria
libre. El siguiente ejemplo dispone espacio para 50 enteros. Obsérvese el uso de sizeof
para asegurar la portabilidad: p apunta al primero de los 1000 bytes de la memoria libre.
El siguiente ejemplo dispone espacio para 50 enteros. Obsérvese el uso de sizeof para
asegurar la portabilidad:

int *p;

p= (int *) malloc(50*sizeof(int));

La función free() es la opuesta de malloc() porque devuelve al sistema la
memoria previamente asignada. Una vez que la memoria ha sido liberada, puede ser
reutilizada en una posterior llamada a malloc(). El prototipo de la función free() es:

void free (void *p);
free(p);

Tipo De Punteros


Puntero genérico: es aquel que no apunta a ningún tipo de dato

void *nombrepuntero;

Se declaran así para que posteriormente se les pueda hacer apuntar a cualquier tipo de
dato.


Puntero nulo: es aquel que no apunta a ningún dato

tipodato *nombrepuntero = NULL;

NULL es una constante definida en stdio.h. Se utiliza para indicar situaciones de error

Apuntadores Y Direcciones De Memoria


Puntero constante: es aquel que se declara como tal y, por tanto, siempre apunta a
la misma posición

tipodato *const nombrepuntero;

El contenido, el dato apuntado, si puede cambiar. Si es el dato lo que se declara
como constante se escribe

const tipodato *nombrepuntero;

Si el puntero y el dato al que apunta se declaran constantes

const tipodato *const nombrepuntero

PUNTEROS A STRINGS

No hay gran diferencia entre el trato de punteros a arrays , y a strings , ya que
estos dos últimos son entidades de la misma clase . Sin embargo analicemos algunas
particularidades . Así como inicializamos un string con un grupo de caracteres
terminados en '0' , podemos asignar al mismo un puntero :
p = "Esto es un string constante " ;

Esta operación no implica haber copiado el texto , sino sólo que a p se le ha
asignado la dirección de memoria donde reside la "E" del texto . A partir de ello
podemos manejar a p como lo hemos hecho hasta ahora . Veamos un ejemplo

#include

#define TEXTO1 "¿ Hola , como "

#define TEXTO2 "le va a Ud. ? "

Apuntadores Y Direcciones De Memoria
main()

{

char palabra[20] , *p ;

int i ;

p = TEXTO1 ;

for( i = 0 ; ( palabra[i] = *p++ ) != '0' ; i++ ) ;

p = TEXTO2 ;

printf("%s" , palabra ) ;

printf("%s" , p ) ;

return 0 ;

}

Definimos primero dos strings constantes TEXTO1 y TEXTO2 , luego
asignamos al puntero p la dirección del primero , y seguidamente en el FOR copiamos
el contenido de éste en el array palabra , observe que dicha operación termina cuando el
contenido de lo apuntado por p es el terminador del string , luego asignamos a p la
dirección de TEXTO2 y finalmente imprimimos ambos strings , obteniendo una salida
del tipo : " ¿ Hola , como le va a UD. ? " ( espero que bien ) .

Reconozcamos que esto se podría haber escrito más compacto, si hubieramos
recordado que palabra tambien es un puntero y NULL es cero , así podemos poner en
vez del FOR
while( *palabra++ = *p++ ) ;

Apuntadores Y Direcciones De Memoria
Vemos que aquí se ha agregado muy poco a lo ya sabido , sin embargo hay un
tipo de error muy frecuente , que podemos analizar , fíjese en el EJEMPLO siguiente , ¿
ve algun problema ? .

( CON ERRORES )

#include

char *p , palabra[20] ;

printf("Escriba su nombre : ") ;

scanf("%s" , p ) ;

palabra = "¿ Como le va " ;

printf("%s%s" , palabra , p ) ; }

Pues hay dos errores , a falta de uno , el primero ya fue analizado antes , la
expresión scanf("%s" , p ) es correcta pero , el error implícito es no haber inicializado al
puntero p , el cual sólo fué definido , pero aun no apunta a ningun lado válido . El
segundo error está dado por la expresión : palabra = " ¿ Como le va " ; ( también visto
anteriormente ) ya que el nombre del array es una constante y no puede ser asignado a
otro valor .

¿Como lo escribiríamos para que funcione correctamente ?

(CORRECTO)
#include

#include

Apuntadores Y Direcciones De Memoria
#include

char *p , palabra[20] ;

p = (char *)malloc(sizeof(char)128) ;

printf("Escriba su nombre : ") ;

scanf("%s" , p ) ;

strcpy(palabra , "¿ Como le va " ) ;

printf("%s%s" , palabra , p ) ; }

Observe que antes de scanf() se ha inicializado a p, mediante el retorno de
malloc() y a al array palabra se le copiado el string mediante la función vista
anteriormente.

Debemos aclarar también que, la secuencia de control %s en el printf() impone
enviar a la pantalla un string, estando éste apuntado por el argumento siguiente al
control, éste puede ser tanto el nombre de un array, como un puntero, ya que ambos
explicitan direcciones.

Una forma alternativa de resolverlo , sería:
#include

main()

{

char p[20] , *palabra ;

printf("Escriba su nombre : ") ;

Apuntadores Y Direcciones De Memoria
scanf("%s" , p ) ;

palabra = "¿ Como le va " ;

printf("%s%s" , palabra , p ) ; }

Obsérvese , que es idéntico al primero , con la salvedad que se ha invertido las
declaraciones de las variables , ahora el puntero es palabra y el array es p . Ambas
soluciones son equivalentes y dependerá del resto del programa , cual es la mejor
elección .

PUNTEROS Y FUNCIONES

La relación entre los punteros y las funciones , puede verse en tres casos
distintos , podemos pasarle a una función un puntero como argumento (por supuesto si
su parámetro es un puntero del mismo tipo ) , pueden devolver un puntero de cualquier
tipo , como ya hemos visto con malloc() y calloc() , y es posible también apuntar a la
dirección de la función , en otras palabras , al código en vez de a un dato.

PUNTEROS COMO PARAMETROS DE FUNCIONES .

Supongamos que hemos declarado una estructura , se puede pasar a una función
de la siguiente manera:

struct conjunto {

int a

;

double b ;

char c[5] ;

Apuntadores Y Direcciones De Memoria
} datos

;

void una_funcion( struct conjunto datos );

Hicimos notar, en su momento, que en este caso la estructura se copiaba en el
stack y así era pasada a la función, con el peligro que esto implicaba, si ella era muy
masiva, de agotarlo.

Otra forma equivalente es utilizar un puntero a la estructura :

struct conjunto {

int a

;

double b ;

char c[5] ;

} *pdatos

;

void una_funcion( struct conjunto *pdatos ) ;

Con lo que sólo ocupo lugar en el stack para pasarle la dirección de la misma.
Luego en la función, como todos los miembros de la estructuras son accesibles por
medio del puntero, tengo pleno control de la misma.

Un ejemplo de funciones ya usadas que poseen como parámetros a punteros son:

scanf(puntero_a_string_de_control , punteros_a_variables)
printf(puntero_a_string_de_control , variables )

En ambas vemos que los strings de control son , como no podría ser de otro
modo , punteros , es decir que los podríamos definir fuera de la función y luego
pasarselos a ellas :
Apuntadores Y Direcciones De Memoria
p_control = "valor : %d " ;

printf( p_control , var ) ;

PUNTEROS COMO RESULTADO DE UNA FUNCION

Las funciones que retornan punteros son por lo general aquellas que modifican
un argumento, que les ha sido pasado por dirección ( por medio de un puntero ) ,
devolviendo un puntero a dicho argumento modificado , ó las que reservan lugar en el
Heap para las variables dinámicas , retornando un puntero a dicho bloque de memoria .
Así podremos declarar funciónes del tipo de:

char *funcion1( char * var1 ) ;

double *funcion2(int i , double j , char *k ) ;

struct item *funcion3( struct stock *puntst ) ;

El retorno de las mismas puede inicializar punteros del mismo tipo al devuelto ,
ó distinto , por medio del uso del casting . Algunas funciones , tales como malloc() y
calloc() definen su retorno como punteros a void :

void *malloc( int tamano ) ;

De esta forma al invocarlas , debemos indicar el tipo de puntero de deseamos

p = (double *)malloc( 64 ) ;

Apuntadores Y Direcciones De Memoria
Ejercicio 1:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct agenda_telefonica
{
char _nombre[25];
char _apellido[25];

char _numero[12];
struct agenda_telefonica *siguiente_registro;
}tipo_agenda;

typedef tipo_agenda *tipo_nodo,*tipo_lista;

int opcion,posicion,resp,i;
char nombre[25],apellido[25],numero[12];

void insertar(tipo_lista *r_lista,char r_nombre[],char r_apellido[],char
r_numero[]);
void borrar(tipo_lista *r_lista,char r_nombre[]);
void mostrar(tipo_lista *lista);

int main()
{clrscr();
tipo_lista lista = NULL;

do
{
printf("nnnnnttt! M E N U !nn");
printf("tt1) Nuevo Registronn");

printf("tt2) Mostrar Agenda Telefonicann");
printf("tt3) Borrar Registronn");
printf("tt4) Cerrar el programann");
printf("tt----> OPCION [1-4]: ");
Apuntadores Y Direcciones De Memoria
scanf("%i",&opcion);
system("clear");

switch(opcion)
{
case 1:

printf("nnnnnttt! NUEVO REGISTRO
!nn");
printf("tNombre : ");
scanf("%s",nombre);

printf("nntApellido : ");
scanf("%s",apellido);
printf("nntNumero movil :");
scanf("%s",numero);

system("clear");
printf("nnnnnttt! NUEVO REGISTRO
!nn");

printf("tNombrettApellidottNumeronnt%stt%stt%sn",nombre,
apellido,nume ro);
printf("t-----------------------------------------------");
printf("nntttDesea Guardar este

registro?nttt1) Sinttt2) NontttOPCION: ");
scanf("%i",&resp);getchar();
if (resp==1)
{

insertar(&lista,nombre,apellido,numero);
printf("nnttSu Registro ha sido

guardado exitosamenten");
getchar();
system("clear");
}
Apuntadores Y Direcciones De Memoria
else
{

printf("nnttEl registro no
fue guardado");
getchar();
system("clear");

}
break;
case 2:
printf("nnnntt ***** A G E N D A

*****n");
mostrar(&lista);getchar();
getchar();
system("clear");

break;
case 3:
mostrar(&lista);
printf("nnttIntroduzca el nombre a

BUSCAR : ");
scanf("%s",nombre);
borrar(&lista,nombre);
}

}while(opcion<4);
printf("ttCreado por : !Luis Hernandez!nn");
getchar();
return 0;

}
void insertar(tipo_lista *r_lista,char r_nombre[],char r_apellido[],char
r_numero[])
{

tipo_nodo primer,ultimo,anterior;

primer = *r_lista;
if (primer == NULL)
Apuntadores Y Direcciones De Memoria
{
primer == malloc(sizeof(tipo_agenda));

if(primer != NULL)
{
strcpy(primer->_numero,r_numero);

strcpy(primer->_nombre,r_nombre);
strcpy(primer->_apellido,r_apellido);

primer->siguiente_registro = NULL;
*r_lista = primer;
}
}

else
{
ultimo == malloc(sizeof(tipo_agenda));
if (ultimo != NULL)

{
strcpy(ultimo->_numero,r_numero);
strcpy(ultimo->_nombre,r_nombre);
strcpy(ultimo->_apellido,r_apellido);

if(strcmp((*r_lista)->_nombre,ultimo>_nombre)>0)
{
ultimo->siguiente_registro = *r_lista;

*r_lista = ultimo;
}
else
{

anterior = *r_lista;

Apuntadores Y Direcciones De Memoria
while (anterior>siguiente_registro

&& strcmp(anterior->siguie nte_registro-

>_nombre,ultimo->_nombre)<0)
anterior = anterior>siguiente_registro;

ultimo->siguiente_registro =
anterior->siguiente_registro;
anterior->siguiente_registro
= ultimo;

}
}
}
}

void mostrar(tipo_lista *lista)
{
tipo_nodo nodo_muestra=*lista;

printf("tt__________________________________n");
while(nodo_muestra != NULL)
{
printf("tt|Nombre

: | %sntt|Apellido : | %sntt|Numero

| %sn",nodo_muestra->_nombre,nodo_muestra->_apellido,nodo_muestra>_numero);
printf("tt|________________________________n");
nodo_muestra = nodo_muestra->siguiente_registro;

}

}
void borrar(tipo_lista *r_lista,char r_nombre[])

{
tipo_nodo nodo,anterior;

nodo= *r_lista;
Apuntadores Y Direcciones De Memoria

:
anterior = NULL;
while(nodo && strcmp(nodo->_nombre,r_nombre)<0)

{
anterior = nodo;
nodo = nodo->siguiente_registro;
}

if(!nodo || strcmp(nodo->_nombre,r_nombre)!=0)
{
printf("nntt"%s" no se encuentra en la
listann",r_nombre);getchar();

getchar();
system("clear");
return;
}

else {getchar();
/* Borrar el nodo */
if(!anterior) /* Primer elemento */
*r_lista = nodo->siguiente_registro;

else /* un elemento cualquiera */
anterior->siguiente_registro = nodo>siguiente_registro;
free(nodo);

printf("ntt"%s" ha sido eliminado de la
lista",r_nombre);
getchar();
system("clear");

}
}

Apuntadores Y Direcciones De Memoria
Ejercicio 2:

#include <conio.h>
#include <stdio.h>
#define N_VENDEDORES 18
#define N_PRODUCTOS 10

/* Función que muestra el menú del programa y retorna
el número de menú elegido por el usuario */

int mostrarMenu();
/* Función que calcula el total de todas las ventas*/

double mostrarTotal(double v[][N_PRODUCTOS]);

/* Función que calcula el total de ventas de un vendedor*/

double totalVendedor(double v[][N_PRODUCTOS], int nVendedor);

int main(){
clrscr();
double ventas[N_VENDEDORES][N_PRODUCTOS]={0};

int resp=mostrarMenu();
int nvend, nprod;
double cantidad;

while(resp!=4){
switch(resp){
case 1:
printf("Numero de vendedor: ");scanf("%d",&nvend);

printf("Numero de producto: ");scanf("%d",&nprod);
printf("Cantidad ventida: ");scanf("%lf",&cantidad);
ventas[nvend][nprod]=cantidad;
break;
Apuntadores Y Direcciones De Memoria
case 2:
printf("Numero de vendedor: ");scanf("%d",&nvend);

printf("Ventas total del vendedor %d=%.2lfn",

nvend,totalVendedor(ventas,nvend));
break;

case 3:
printf("Total de ventas=%.2lfn",
mostrarTotal(ventas));
break;

}
resp=mostrarMenu();
}
getch();

}
int mostrarMenu(){
int resp;
printf("nn");

printf("1) A¤adir datosn");
printf("2) Mostrar total de vendedorn");
printf("3) Mostrar total de ventasn");
printf("4) Salirn");

scanf("%d",&resp);
return resp;
}
double mostrarTotal(double v[][N_PRODUCTOS]){

double resp=0;
int i,j;
for(i=0;i<N_VENDEDORES;i++){
for(j=0;j<N_PRODUCTOS;j++){

resp+=v[i][j];
}
}
return resp;
Apuntadores Y Direcciones De Memoria
}
double totalVendedor(double v[][N_PRODUCTOS], int nVendedor){

double resp=0;
int i;
for(i=0;i<N_PRODUCTOS;i++){
resp+=v[nVendedor][i];

}
return resp;
}

Apuntadores Y Direcciones De Memoria

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
Lenguajes diapositivas
Lenguajes diapositivasLenguajes diapositivas
Lenguajes diapositivasstarduslex
 
Tema 8 www.fresymetal.com
Tema 8 www.fresymetal.comTema 8 www.fresymetal.com
Tema 8 www.fresymetal.comFresyMetal
 
Tema 7 www.fresymetal.com
Tema 7 www.fresymetal.comTema 7 www.fresymetal.com
Tema 7 www.fresymetal.comFresyMetal
 
Lenguajec 1
Lenguajec 1Lenguajec 1
Lenguajec 1joeshego
 
Comandos importantes en c++
Comandos importantes en c++Comandos importantes en c++
Comandos importantes en c++Andy Otañez
 
Elementos básicos de c++
Elementos básicos de c++Elementos básicos de c++
Elementos básicos de c++luiscristian
 
Python básico
Python básicoPython básico
Python básicoCodeSyntax
 
Tema7 dinamicas
Tema7 dinamicasTema7 dinamicas
Tema7 dinamicaslabebelo
 
BIBLIOTECAS EN PROGRAMACION
BIBLIOTECAS EN PROGRAMACIONBIBLIOTECAS EN PROGRAMACION
BIBLIOTECAS EN PROGRAMACIONUTPL
 
1ra parte elementos basicos del lenguaje
1ra parte elementos basicos del lenguaje1ra parte elementos basicos del lenguaje
1ra parte elementos basicos del lenguajeyuli02
 

Was ist angesagt? (19)

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
 
Lenguajes diapositivas
Lenguajes diapositivasLenguajes diapositivas
Lenguajes diapositivas
 
Tema 8 www.fresymetal.com
Tema 8 www.fresymetal.comTema 8 www.fresymetal.com
Tema 8 www.fresymetal.com
 
Tema 7 www.fresymetal.com
Tema 7 www.fresymetal.comTema 7 www.fresymetal.com
Tema 7 www.fresymetal.com
 
Lenguajec 1
Lenguajec 1Lenguajec 1
Lenguajec 1
 
nodo
nodonodo
nodo
 
Introduccions a java
Introduccions a javaIntroduccions a java
Introduccions a java
 
Comandos importantes en c++
Comandos importantes en c++Comandos importantes en c++
Comandos importantes en c++
 
Elementos básicos de c++
Elementos básicos de c++Elementos básicos de c++
Elementos básicos de c++
 
Lenguaje c++
Lenguaje c++Lenguaje c++
Lenguaje c++
 
Pe15 cadenacaracteres
Pe15 cadenacaracteresPe15 cadenacaracteres
Pe15 cadenacaracteres
 
Python básico
Python básicoPython básico
Python básico
 
Poo4
Poo4Poo4
Poo4
 
Tema7 dinamicas
Tema7 dinamicasTema7 dinamicas
Tema7 dinamicas
 
BIBLIOTECAS EN PROGRAMACION
BIBLIOTECAS EN PROGRAMACIONBIBLIOTECAS EN PROGRAMACION
BIBLIOTECAS EN PROGRAMACION
 
Lenguaje c++
Lenguaje c++Lenguaje c++
Lenguaje c++
 
1ra parte elementos basicos del lenguaje
1ra parte elementos basicos del lenguaje1ra parte elementos basicos del lenguaje
1ra parte elementos basicos del lenguaje
 
Arreglos en c++2020
Arreglos en c++2020Arreglos en c++2020
Arreglos en c++2020
 

Andere mochten auch

Guia del-video-tutorial-phpapp01
Guia del-video-tutorial-phpapp01Guia del-video-tutorial-phpapp01
Guia del-video-tutorial-phpapp01Halmiron85
 
Química2 bach 6.8 segundo principio de la termodinámica
Química2 bach 6.8 segundo principio de la termodinámicaQuímica2 bach 6.8 segundo principio de la termodinámica
Química2 bach 6.8 segundo principio de la termodinámicaTarpafar
 
Cte segunda sesion primaria 2014 2015 pdf
Cte segunda sesion primaria 2014 2015 pdfCte segunda sesion primaria 2014 2015 pdf
Cte segunda sesion primaria 2014 2015 pdfyuuki_88
 
Química2 bach 5.4 disoluciones
Química2 bach 5.4 disolucionesQuímica2 bach 5.4 disoluciones
Química2 bach 5.4 disolucionesTarpafar
 
Guía de referencia
Guía de referenciaGuía de referencia
Guía de referencia990429
 
Física2 bach 1.2 estudio cinemático del mas
Física2 bach 1.2 estudio cinemático del mas Física2 bach 1.2 estudio cinemático del mas
Física2 bach 1.2 estudio cinemático del mas Tarpafar
 
Trabajo tina vianney (1)
Trabajo tina vianney (1)Trabajo tina vianney (1)
Trabajo tina vianney (1)Tina Campos
 
Marruecos Mágico 2012
Marruecos Mágico 2012Marruecos Mágico 2012
Marruecos Mágico 2012ROSCHOTPV
 
Autoevaluacion prod1
Autoevaluacion prod1Autoevaluacion prod1
Autoevaluacion prod1Lolis Morales
 
Formación del estado colombiano
Formación del estado colombianoFormación del estado colombiano
Formación del estado colombiano990429
 

Andere mochten auch (20)

Trasplantes
TrasplantesTrasplantes
Trasplantes
 
Guia del-video-tutorial-phpapp01
Guia del-video-tutorial-phpapp01Guia del-video-tutorial-phpapp01
Guia del-video-tutorial-phpapp01
 
Taller Osalan
Taller OsalanTaller Osalan
Taller Osalan
 
El universo
El universoEl universo
El universo
 
Química2 bach 6.8 segundo principio de la termodinámica
Química2 bach 6.8 segundo principio de la termodinámicaQuímica2 bach 6.8 segundo principio de la termodinámica
Química2 bach 6.8 segundo principio de la termodinámica
 
Cte segunda sesion primaria 2014 2015 pdf
Cte segunda sesion primaria 2014 2015 pdfCte segunda sesion primaria 2014 2015 pdf
Cte segunda sesion primaria 2014 2015 pdf
 
Distribución Binomial
Distribución Binomial Distribución Binomial
Distribución Binomial
 
Tp nº10
Tp nº10Tp nº10
Tp nº10
 
Química2 bach 5.4 disoluciones
Química2 bach 5.4 disolucionesQuímica2 bach 5.4 disoluciones
Química2 bach 5.4 disoluciones
 
Guía de referencia
Guía de referenciaGuía de referencia
Guía de referencia
 
Deber melo
Deber meloDeber melo
Deber melo
 
Física2 bach 1.2 estudio cinemático del mas
Física2 bach 1.2 estudio cinemático del mas Física2 bach 1.2 estudio cinemático del mas
Física2 bach 1.2 estudio cinemático del mas
 
Paris
ParisParis
Paris
 
Georgia
GeorgiaGeorgia
Georgia
 
Trabajo tina vianney (1)
Trabajo tina vianney (1)Trabajo tina vianney (1)
Trabajo tina vianney (1)
 
Desafío n 7 1
Desafío n 7 1Desafío n 7 1
Desafío n 7 1
 
Marruecos Mágico 2012
Marruecos Mágico 2012Marruecos Mágico 2012
Marruecos Mágico 2012
 
Autoevaluacion prod1
Autoevaluacion prod1Autoevaluacion prod1
Autoevaluacion prod1
 
Formación del estado colombiano
Formación del estado colombianoFormación del estado colombiano
Formación del estado colombiano
 
Implementos de cocina
Implementos de cocinaImplementos de cocina
Implementos de cocina
 

Ähnlich wie Luis hernandez 22310621

Clase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacionClase 11- fundamentos de la programacion
Clase 11- fundamentos de la programaciondiego MC
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++die_dex
 
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
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamientoSergio Ramos
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datosluna_72
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacionYsaac Ruiz
 
Lenguajec diapositivas
Lenguajec diapositivasLenguajec diapositivas
Lenguajec diapositivastacubomx
 
Apuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasApuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasXendor Resendiz
 
Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Renny Batista
 
Lenguaje c diapositivas
Lenguaje c diapositivasLenguaje c diapositivas
Lenguaje c diapositivasstarduslex
 

Ähnlich wie Luis hernandez 22310621 (20)

Clase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacionClase 11- fundamentos de la programacion
Clase 11- fundamentos de la programacion
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++
 
Punteros
PunterosPunteros
Punteros
 
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
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamiento
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datos
 
Estructuras dinámicas de datos
Estructuras dinámicas de datosEstructuras dinámicas de datos
Estructuras dinámicas de datos
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacion
 
Arreglos
ArreglosArreglos
Arreglos
 
Tipos de datos en C
Tipos de datos en CTipos de datos en C
Tipos de datos en C
 
08 - Punteros en lenguaje C
08 - Punteros en lenguaje C08 - Punteros en lenguaje C
08 - Punteros en lenguaje C
 
Apuntadores y listas
Apuntadores y listasApuntadores y listas
Apuntadores y listas
 
Lenguajec diapositivas
Lenguajec diapositivasLenguajec diapositivas
Lenguajec diapositivas
 
Teoria punteros
Teoria punterosTeoria punteros
Teoria punteros
 
Apuntadores, cadenas y estructuras
Apuntadores, cadenas y estructurasApuntadores, cadenas y estructuras
Apuntadores, cadenas y estructuras
 
Modelo Simulado
Modelo SimuladoModelo Simulado
Modelo Simulado
 
arrays
arraysarrays
arrays
 
Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015
 
Solucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectoresSolucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectores
 
Lenguaje c diapositivas
Lenguaje c diapositivasLenguaje c diapositivas
Lenguaje c diapositivas
 

Kürzlich hochgeladen

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfDaniel Ángel Corral de la Mata, Ph.D.
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxRAMON EUSTAQUIO CARO BAYONA
 
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxSIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxLudy Ventocilla Napanga
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docxAgustinaNuez21
 
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsxJuanpm27
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOweislaco
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfManuel Molina
 
Técnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesTécnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesRaquel Martín Contreras
 
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaManejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaLuis Minaya
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressionsConsueloSantana3
 
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdf
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdfFichas de matemática DE PRIMERO DE SECUNDARIA.pdf
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdfssuser50d1252
 

Kürzlich hochgeladen (20)

Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
 
Sesión La luz brilla en la oscuridad.pdf
Sesión  La luz brilla en la oscuridad.pdfSesión  La luz brilla en la oscuridad.pdf
Sesión La luz brilla en la oscuridad.pdf
 
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxSIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdfTema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docx
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
 
DIA INTERNACIONAL DAS FLORESTAS .
DIA INTERNACIONAL DAS FLORESTAS         .DIA INTERNACIONAL DAS FLORESTAS         .
DIA INTERNACIONAL DAS FLORESTAS .
 
VISITA À PROTEÇÃO CIVIL _
VISITA À PROTEÇÃO CIVIL                  _VISITA À PROTEÇÃO CIVIL                  _
VISITA À PROTEÇÃO CIVIL _
 
Técnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesTécnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materiales
 
TL/CNL – 2.ª FASE .
TL/CNL – 2.ª FASE                       .TL/CNL – 2.ª FASE                       .
TL/CNL – 2.ª FASE .
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsaManejo del Dengue, generalidades, actualización marzo 2024 minsa
Manejo del Dengue, generalidades, actualización marzo 2024 minsa
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressions
 
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdf
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdfFichas de matemática DE PRIMERO DE SECUNDARIA.pdf
Fichas de matemática DE PRIMERO DE SECUNDARIA.pdf
 

Luis hernandez 22310621

  • 1. República Bolivariana de Venezuela Ministerio del Poder Popular Para La Defensa Universidad Nacional Experimental Politécnica De Las Fuerzas Armadas UNEFA –Yaracuy Extensión Nirgua Profesor: Luis Sequera Integrante: Luis Hernández Programación I Apuntadores Y Direcciones De Memoria
  • 2. Punteros Y Direccionamiento De Memoria Un puntero es una variable que contiene una dirección de memoria. Normalmente, esa dirección es la posición de otra variable de memoria. Si una variable contiene la dirección de otra variable, entonces se dice que la primera variable apunta a la segunda. Si una variable va a contener un puntero, entonces tiene que declararse como tal. Una declaración de un puntero consiste en un tipo base, un * y el nombre de la variable. La forma general es: tipo *nombre; Donde tipo es cualquier tipo válido y nombre es el nombre de la variable puntero. El tipo base del puntero define el tipo de variables a las que puede apuntar. Técnicamente, cualquier tipo de puntero puede apuntar a cualquier dirección de la memoria, sin embargo, toda la aritmética de punteros esta hecha en relación a sus tipos base, por lo que es importante declarar correctamente el puntero. Existen dos operadores especiales de punteros: & y *. El operador de dirección (&) devuelve la dirección de memoria de su operando. El operador de indirección (*) devuelve el contenido de la dirección apuntada por el operando. Después de declarar un puntero, pero antes de asignarle un valor, éste contiene un valor desconocido; si en ese instante lo intenta utilizar, probablemente se estrellará, no sólo el programa sino también el sistema operativo. Por convenio, se debe asignar el valor nulo a un puntero que no este apuntando a ningún sitio, aunque ésto tampoco es seguro. Apuntadores Y Direcciones De Memoria
  • 3. Asignación de punteros Como en el caso de cualquier otra variable, un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero. Por Ejemplo: int x; int *p1,*p2; p1=&x; p2=p1; Tanto p1 como p2 apuntan a x. Aritmética de Punteros Existen sólo dos operaciones aritméticas que se puedan usar con punteros: la suma y la resta. Cada vez que se incrementa un puntero, apunta a la posición de memoria del siguiente elemento de su tipo base. Cada vez que se decrementa, apunta a la posición del elemento anterior. Con punteros a caracteres parece una aritmética normal, sin embargo,el resto de los punteros aumentan o decrecen la longitud del tipo de datos a los que apuntan. Por ejemplo, si asumimos que los enteros son de dos bytes de longitud y p1 es un puntero a entero con valor actual 2000. Entonces, después de la expresión p1++; p1 contiene el valor 2002, no 2001. No pueden realizarse otras operaciones aritméticas sobre los punteros más allá de la suma y resta de un puntero y un entero. En particular, no se pueden multiplicar o dividir punteros y no se puede sumar o restar el tipo float o el tipo double a los punteros. Apuntadores Y Direcciones De Memoria
  • 4. Punteros Y Arrays Existe una estrecha relación entre los punteros y los arrays. Considérese el siguiente fragmento: char cad[80], *p1; p1=cad; Aquí, p1 ha sido asignado a la dirección del primer elemento del array cad. Para acceder al quinto elemento de cad se escribe cad[4] o *(p1+4). Un nombre de array sin índice devuelve la dirección de comienzo del array, que es el primer elemento. El compilador traduce la notación de arrays en notación de punteros. Es decir, al crear un array se genera un puntero (en realidad una constante de puntero) con el mismo nombre que apunta a la dirección del primer elemento del array. Arrays de Punteros Los punteros pueden estructurarse en arrays como cualquier otro tipo de datos. La declaración, por ejemplo, para un array de punteros a enteros de tamaño 10 es: int *x[10]; Para asignar la dirección de una variable entera llamada var al tercer elemento del array de punteros se escribe:x[2]=&var; Se puede encontrar el valor de var de la forma: var de la forma: *x[2];Si se quiere pasar un array de punteros a una función, se puede utilizar el mismo método que se utiliza para otros arrays: llamar simplemente a la función con el nombre del array sin índices. Así se pasa el puntero que apunta al array. No se pasa un puntero a enteros, sino un puntero a un array de punteros a enteros. Apuntadores Y Direcciones De Memoria
  • 5. Indirección Múltiple Se puede hacer que un puntero apunte a otro puntero que apunte a un valor de destino. Esta situación se denomina indirección múltiple o punteros a punteros. Una variable que es puntero a puntero tiene que declararse como tal. Esto se hace colocando un * adicional en frente del nombre de la variable. Por ejemplo, la siguiente declaración inicial indica al compilador que ptr es un puntero a puntero de tipo float:float **ptr; Funciones de Asignación Dinámica Los punteros proporcionan el soporte necesario para el potente sistema de asignación dinámica de memoria de C. La asignación dinámica es la forma en la que un programa puede obtener memoria mientras se está ejecutando. Como ya se ha visto, a las variables globales se les asigna memoria en tiempo de compilación y las locales usan la pila. Sin embargo, durante la ejecución no se pueden añadir variables globales o locales, pero existen ocasiones en las que un programa necesita usar cantidades de memoria variables. El centro del sistema de asignación dinámica está compuesto por las funciones (existentes en la biblioteca stdlib.h) malloc(), que asigna memoria; y free() que la devuelve. El prototipo de la función malloc() es: stdlib.h) malloc(), que asigna memoria; y free() que la devuelve.void *malloc(size_t número de bytes); Tras una llamada fructífera, malloc() devuelve un puntero, el primer byte de memoria dispuesta. Si no hay suficiente memoria libre para satisfacer la petición de malloc(), se da un fallo de asignación y devuelve un nulo. El fragmento de código que sigue asigna 1000 bytes de memoria: Apuntadores Y Direcciones De Memoria
  • 6. char *p; p = (char *) malloc(1000); Después de la asignación, p apunta al primero de los 1000 bytes de la memoria libre. El siguiente ejemplo dispone espacio para 50 enteros. Obsérvese el uso de sizeof para asegurar la portabilidad: p apunta al primero de los 1000 bytes de la memoria libre. El siguiente ejemplo dispone espacio para 50 enteros. Obsérvese el uso de sizeof para asegurar la portabilidad: int *p; p= (int *) malloc(50*sizeof(int)); La función free() es la opuesta de malloc() porque devuelve al sistema la memoria previamente asignada. Una vez que la memoria ha sido liberada, puede ser reutilizada en una posterior llamada a malloc(). El prototipo de la función free() es: void free (void *p); free(p); Tipo De Punteros  Puntero genérico: es aquel que no apunta a ningún tipo de dato void *nombrepuntero; Se declaran así para que posteriormente se les pueda hacer apuntar a cualquier tipo de dato.  Puntero nulo: es aquel que no apunta a ningún dato tipodato *nombrepuntero = NULL; NULL es una constante definida en stdio.h. Se utiliza para indicar situaciones de error Apuntadores Y Direcciones De Memoria
  • 7.  Puntero constante: es aquel que se declara como tal y, por tanto, siempre apunta a la misma posición tipodato *const nombrepuntero; El contenido, el dato apuntado, si puede cambiar. Si es el dato lo que se declara como constante se escribe const tipodato *nombrepuntero; Si el puntero y el dato al que apunta se declaran constantes const tipodato *const nombrepuntero PUNTEROS A STRINGS No hay gran diferencia entre el trato de punteros a arrays , y a strings , ya que estos dos últimos son entidades de la misma clase . Sin embargo analicemos algunas particularidades . Así como inicializamos un string con un grupo de caracteres terminados en '0' , podemos asignar al mismo un puntero : p = "Esto es un string constante " ; Esta operación no implica haber copiado el texto , sino sólo que a p se le ha asignado la dirección de memoria donde reside la "E" del texto . A partir de ello podemos manejar a p como lo hemos hecho hasta ahora . Veamos un ejemplo #include #define TEXTO1 "¿ Hola , como " #define TEXTO2 "le va a Ud. ? " Apuntadores Y Direcciones De Memoria
  • 8. main() { char palabra[20] , *p ; int i ; p = TEXTO1 ; for( i = 0 ; ( palabra[i] = *p++ ) != '0' ; i++ ) ; p = TEXTO2 ; printf("%s" , palabra ) ; printf("%s" , p ) ; return 0 ; } Definimos primero dos strings constantes TEXTO1 y TEXTO2 , luego asignamos al puntero p la dirección del primero , y seguidamente en el FOR copiamos el contenido de éste en el array palabra , observe que dicha operación termina cuando el contenido de lo apuntado por p es el terminador del string , luego asignamos a p la dirección de TEXTO2 y finalmente imprimimos ambos strings , obteniendo una salida del tipo : " ¿ Hola , como le va a UD. ? " ( espero que bien ) . Reconozcamos que esto se podría haber escrito más compacto, si hubieramos recordado que palabra tambien es un puntero y NULL es cero , así podemos poner en vez del FOR while( *palabra++ = *p++ ) ; Apuntadores Y Direcciones De Memoria
  • 9. Vemos que aquí se ha agregado muy poco a lo ya sabido , sin embargo hay un tipo de error muy frecuente , que podemos analizar , fíjese en el EJEMPLO siguiente , ¿ ve algun problema ? . ( CON ERRORES ) #include char *p , palabra[20] ; printf("Escriba su nombre : ") ; scanf("%s" , p ) ; palabra = "¿ Como le va " ; printf("%s%s" , palabra , p ) ; } Pues hay dos errores , a falta de uno , el primero ya fue analizado antes , la expresión scanf("%s" , p ) es correcta pero , el error implícito es no haber inicializado al puntero p , el cual sólo fué definido , pero aun no apunta a ningun lado válido . El segundo error está dado por la expresión : palabra = " ¿ Como le va " ; ( también visto anteriormente ) ya que el nombre del array es una constante y no puede ser asignado a otro valor . ¿Como lo escribiríamos para que funcione correctamente ? (CORRECTO) #include #include Apuntadores Y Direcciones De Memoria
  • 10. #include char *p , palabra[20] ; p = (char *)malloc(sizeof(char)128) ; printf("Escriba su nombre : ") ; scanf("%s" , p ) ; strcpy(palabra , "¿ Como le va " ) ; printf("%s%s" , palabra , p ) ; } Observe que antes de scanf() se ha inicializado a p, mediante el retorno de malloc() y a al array palabra se le copiado el string mediante la función vista anteriormente. Debemos aclarar también que, la secuencia de control %s en el printf() impone enviar a la pantalla un string, estando éste apuntado por el argumento siguiente al control, éste puede ser tanto el nombre de un array, como un puntero, ya que ambos explicitan direcciones. Una forma alternativa de resolverlo , sería: #include main() { char p[20] , *palabra ; printf("Escriba su nombre : ") ; Apuntadores Y Direcciones De Memoria
  • 11. scanf("%s" , p ) ; palabra = "¿ Como le va " ; printf("%s%s" , palabra , p ) ; } Obsérvese , que es idéntico al primero , con la salvedad que se ha invertido las declaraciones de las variables , ahora el puntero es palabra y el array es p . Ambas soluciones son equivalentes y dependerá del resto del programa , cual es la mejor elección . PUNTEROS Y FUNCIONES La relación entre los punteros y las funciones , puede verse en tres casos distintos , podemos pasarle a una función un puntero como argumento (por supuesto si su parámetro es un puntero del mismo tipo ) , pueden devolver un puntero de cualquier tipo , como ya hemos visto con malloc() y calloc() , y es posible también apuntar a la dirección de la función , en otras palabras , al código en vez de a un dato. PUNTEROS COMO PARAMETROS DE FUNCIONES . Supongamos que hemos declarado una estructura , se puede pasar a una función de la siguiente manera: struct conjunto { int a ; double b ; char c[5] ; Apuntadores Y Direcciones De Memoria
  • 12. } datos ; void una_funcion( struct conjunto datos ); Hicimos notar, en su momento, que en este caso la estructura se copiaba en el stack y así era pasada a la función, con el peligro que esto implicaba, si ella era muy masiva, de agotarlo. Otra forma equivalente es utilizar un puntero a la estructura : struct conjunto { int a ; double b ; char c[5] ; } *pdatos ; void una_funcion( struct conjunto *pdatos ) ; Con lo que sólo ocupo lugar en el stack para pasarle la dirección de la misma. Luego en la función, como todos los miembros de la estructuras son accesibles por medio del puntero, tengo pleno control de la misma. Un ejemplo de funciones ya usadas que poseen como parámetros a punteros son: scanf(puntero_a_string_de_control , punteros_a_variables) printf(puntero_a_string_de_control , variables ) En ambas vemos que los strings de control son , como no podría ser de otro modo , punteros , es decir que los podríamos definir fuera de la función y luego pasarselos a ellas : Apuntadores Y Direcciones De Memoria
  • 13. p_control = "valor : %d " ; printf( p_control , var ) ; PUNTEROS COMO RESULTADO DE UNA FUNCION Las funciones que retornan punteros son por lo general aquellas que modifican un argumento, que les ha sido pasado por dirección ( por medio de un puntero ) , devolviendo un puntero a dicho argumento modificado , ó las que reservan lugar en el Heap para las variables dinámicas , retornando un puntero a dicho bloque de memoria . Así podremos declarar funciónes del tipo de: char *funcion1( char * var1 ) ; double *funcion2(int i , double j , char *k ) ; struct item *funcion3( struct stock *puntst ) ; El retorno de las mismas puede inicializar punteros del mismo tipo al devuelto , ó distinto , por medio del uso del casting . Algunas funciones , tales como malloc() y calloc() definen su retorno como punteros a void : void *malloc( int tamano ) ; De esta forma al invocarlas , debemos indicar el tipo de puntero de deseamos p = (double *)malloc( 64 ) ; Apuntadores Y Direcciones De Memoria
  • 14. Ejercicio 1: #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct agenda_telefonica { char _nombre[25]; char _apellido[25]; char _numero[12]; struct agenda_telefonica *siguiente_registro; }tipo_agenda; typedef tipo_agenda *tipo_nodo,*tipo_lista; int opcion,posicion,resp,i; char nombre[25],apellido[25],numero[12]; void insertar(tipo_lista *r_lista,char r_nombre[],char r_apellido[],char r_numero[]); void borrar(tipo_lista *r_lista,char r_nombre[]); void mostrar(tipo_lista *lista); int main() {clrscr(); tipo_lista lista = NULL; do { printf("nnnnnttt! M E N U !nn"); printf("tt1) Nuevo Registronn"); printf("tt2) Mostrar Agenda Telefonicann"); printf("tt3) Borrar Registronn"); printf("tt4) Cerrar el programann"); printf("tt----> OPCION [1-4]: "); Apuntadores Y Direcciones De Memoria
  • 15. scanf("%i",&opcion); system("clear"); switch(opcion) { case 1: printf("nnnnnttt! NUEVO REGISTRO !nn"); printf("tNombre : "); scanf("%s",nombre); printf("nntApellido : "); scanf("%s",apellido); printf("nntNumero movil :"); scanf("%s",numero); system("clear"); printf("nnnnnttt! NUEVO REGISTRO !nn"); printf("tNombrettApellidottNumeronnt%stt%stt%sn",nombre, apellido,nume ro); printf("t-----------------------------------------------"); printf("nntttDesea Guardar este registro?nttt1) Sinttt2) NontttOPCION: "); scanf("%i",&resp);getchar(); if (resp==1) { insertar(&lista,nombre,apellido,numero); printf("nnttSu Registro ha sido guardado exitosamenten"); getchar(); system("clear"); } Apuntadores Y Direcciones De Memoria
  • 16. else { printf("nnttEl registro no fue guardado"); getchar(); system("clear"); } break; case 2: printf("nnnntt ***** A G E N D A *****n"); mostrar(&lista);getchar(); getchar(); system("clear"); break; case 3: mostrar(&lista); printf("nnttIntroduzca el nombre a BUSCAR : "); scanf("%s",nombre); borrar(&lista,nombre); } }while(opcion<4); printf("ttCreado por : !Luis Hernandez!nn"); getchar(); return 0; } void insertar(tipo_lista *r_lista,char r_nombre[],char r_apellido[],char r_numero[]) { tipo_nodo primer,ultimo,anterior; primer = *r_lista; if (primer == NULL) Apuntadores Y Direcciones De Memoria
  • 17. { primer == malloc(sizeof(tipo_agenda)); if(primer != NULL) { strcpy(primer->_numero,r_numero); strcpy(primer->_nombre,r_nombre); strcpy(primer->_apellido,r_apellido); primer->siguiente_registro = NULL; *r_lista = primer; } } else { ultimo == malloc(sizeof(tipo_agenda)); if (ultimo != NULL) { strcpy(ultimo->_numero,r_numero); strcpy(ultimo->_nombre,r_nombre); strcpy(ultimo->_apellido,r_apellido); if(strcmp((*r_lista)->_nombre,ultimo>_nombre)>0) { ultimo->siguiente_registro = *r_lista; *r_lista = ultimo; } else { anterior = *r_lista; Apuntadores Y Direcciones De Memoria
  • 18. while (anterior>siguiente_registro && strcmp(anterior->siguie nte_registro- >_nombre,ultimo->_nombre)<0) anterior = anterior>siguiente_registro; ultimo->siguiente_registro = anterior->siguiente_registro; anterior->siguiente_registro = ultimo; } } } } void mostrar(tipo_lista *lista) { tipo_nodo nodo_muestra=*lista; printf("tt__________________________________n"); while(nodo_muestra != NULL) { printf("tt|Nombre : | %sntt|Apellido : | %sntt|Numero | %sn",nodo_muestra->_nombre,nodo_muestra->_apellido,nodo_muestra>_numero); printf("tt|________________________________n"); nodo_muestra = nodo_muestra->siguiente_registro; } } void borrar(tipo_lista *r_lista,char r_nombre[]) { tipo_nodo nodo,anterior; nodo= *r_lista; Apuntadores Y Direcciones De Memoria :
  • 19. anterior = NULL; while(nodo && strcmp(nodo->_nombre,r_nombre)<0) { anterior = nodo; nodo = nodo->siguiente_registro; } if(!nodo || strcmp(nodo->_nombre,r_nombre)!=0) { printf("nntt"%s" no se encuentra en la listann",r_nombre);getchar(); getchar(); system("clear"); return; } else {getchar(); /* Borrar el nodo */ if(!anterior) /* Primer elemento */ *r_lista = nodo->siguiente_registro; else /* un elemento cualquiera */ anterior->siguiente_registro = nodo>siguiente_registro; free(nodo); printf("ntt"%s" ha sido eliminado de la lista",r_nombre); getchar(); system("clear"); } } Apuntadores Y Direcciones De Memoria
  • 20. Ejercicio 2: #include <conio.h> #include <stdio.h> #define N_VENDEDORES 18 #define N_PRODUCTOS 10 /* Función que muestra el menú del programa y retorna el número de menú elegido por el usuario */ int mostrarMenu(); /* Función que calcula el total de todas las ventas*/ double mostrarTotal(double v[][N_PRODUCTOS]); /* Función que calcula el total de ventas de un vendedor*/ double totalVendedor(double v[][N_PRODUCTOS], int nVendedor); int main(){ clrscr(); double ventas[N_VENDEDORES][N_PRODUCTOS]={0}; int resp=mostrarMenu(); int nvend, nprod; double cantidad; while(resp!=4){ switch(resp){ case 1: printf("Numero de vendedor: ");scanf("%d",&nvend); printf("Numero de producto: ");scanf("%d",&nprod); printf("Cantidad ventida: ");scanf("%lf",&cantidad); ventas[nvend][nprod]=cantidad; break; Apuntadores Y Direcciones De Memoria
  • 21. case 2: printf("Numero de vendedor: ");scanf("%d",&nvend); printf("Ventas total del vendedor %d=%.2lfn", nvend,totalVendedor(ventas,nvend)); break; case 3: printf("Total de ventas=%.2lfn", mostrarTotal(ventas)); break; } resp=mostrarMenu(); } getch(); } int mostrarMenu(){ int resp; printf("nn"); printf("1) A¤adir datosn"); printf("2) Mostrar total de vendedorn"); printf("3) Mostrar total de ventasn"); printf("4) Salirn"); scanf("%d",&resp); return resp; } double mostrarTotal(double v[][N_PRODUCTOS]){ double resp=0; int i,j; for(i=0;i<N_VENDEDORES;i++){ for(j=0;j<N_PRODUCTOS;j++){ resp+=v[i][j]; } } return resp; Apuntadores Y Direcciones De Memoria
  • 22. } double totalVendedor(double v[][N_PRODUCTOS], int nVendedor){ double resp=0; int i; for(i=0;i<N_PRODUCTOS;i++){ resp+=v[nVendedor][i]; } return resp; } Apuntadores Y Direcciones De Memoria