Professional Documents
Culture Documents
Punteros
#include<stdio.h>
int main(int argc,char *argv[]){
int *ptrID, ID;
ID = 8;
printf("%p = %p\n",ptrID,&ID);
ptrID = &ID; // puntero a ID
//miramos el valor de prtID
printf("%d\n",*ptrID);//accediendo al valor con el operador *
printf("%d\n",ptrID[0]);//accediendo al valor con el operador [ ]
// miramos las pocisiones en memoria
printf(" %p = %p \n",ptrID, &ID);
return 0;
}
Los Operadores Punteros
Al trabajar con punteros se emplean dos
operadores especiales que son & y *.
El primero es un operador monario y sirve
para acceder a la dirección de memoria.(Ver
ejemplo anterior)
El segundo puede significar operador de
contenido o dirección según el contexto;
veamos el siguiente ejemplo y analicemos
cuando int a=1,*p1,*p2,*p3; se comportan
como puntero o cuando simplemente estamos
accediendo a su valor.
Ejemplo
#include<stdio.h>
//funcion que me cambio los valores del dato sin cambiar las direcciones de memoria
void cambiar_valores(int *p1,int *p2){
p1[0]=p2[0];
}
//funcion para cambiar las posiciones de memoria
void cambiar_punteros(void **x, void **y) {
void *t = *x;
*x = *y;
*y = t;
}
int main(int argc,char *argv[]){
int a=1,*p1,*p2,p3[]={2},*p4;
//imprimimo las posiciones actuales de memoria
printf("Posiciones iniciales de memoria => a=%p p1=%p p2=%p p3=%p \n",&a,p1,p2,p3);
p1=&a;
p2=p1;
p4=p3;//asignacion de array a puntero visto en la clase anterior
printf("Posiciones finales de memoria => a=%p p1=%p p2=%p p3=%p\n",&a,p1,p2,p3);
//valores de la pocison de memoria
printf(" %d %d %d %d \n",a,*p1,p2[0],*(p3+0));
//ahora quiero que los punteros cambien de valor pero que conserven su posicion
cambiar_valores(p1,p3);
//imprimimos las posiciones de memoria y deben ser distintas
printf(" p1=%p p3=%p \n",p1,p3);
//imprimimos los valores y p1 debe tener el de p3
printf(" p1=%d p3=%d \n",*p1,*p3);
//ahora quiero que p2 tenga la posicion de memoria de p4 y a la inversa ¿Es lo mismo cambiar p1 que p2? R/ si
p2[0]=1;//cambio el valor para demostrar
printf("posiciones y valores iniciales -> p2=%p *p2=%d , p4=%p *p4=%d \n",p2,*p2,p4,*p4);
cambiar_punteros(&p2,&p4);
printf("posiciones y valores iniciales -> p2=%p *p2=%d , p4=%p *p4=%d \n",p2,*p2,p4,*p4);
}
Operadores en Punteros
#include<stdio.h>
#include<math.h>
double delta=0.001;
double derivar(double (f)(double),double x){
return (f(x+delta)-f(x-delta))/(2*delta);
}
int main(int argc,char *argv[]){
double x=M_PI/2;
double df=derivar(sin,x);
printf("derivada del seno en %lf = %lf\n",x,df);
}
Ejercicios