Sei sulla pagina 1di 12

Prácticas de Metodología y Tecnología de la Programación

•  Un puntero es una variable que guarda la dirección de memoria de otra


variable

•  Declaración: int * p;

p es un puntero a una variable de tipo int

•  C posee dos operadores especiales para los punteros:

& : devuelve la dirección de memoria de una variable


* : devuelve el valor almacenado en la dirección de memoria a la cual hace
referencia/apunta un puntero.

Breve introducción a los punteros en C


int num = 100;
int * pint;

//Asignamos a pint la dirección


de num. pint apunta a num

pint = #
printf("%d\n",*pint); Variable Dirección Contenido
num 10000 100
125
// Imprime 100 por pantalla
pint 10002 10000
//Ponemos el valor 125 en la
dirección a la cual apunta pint

*pint= 125;
printf("%d\n",num);

// Imprime 125 por pantalla

Breve introducción a los punteros en C


int num = 100; int num = 100;
int * pint; int * pint;
*pint = 200; pint = num;
printf("%d\n",*pint); printf ("%d\n",*pint);

Produce un error ya que pint no Imprime el contenido de la posición 100


apunta a ninguna variable y no de memoria. Si esa posición es
puede almacenarse el valor 200 inaccesible se produce un error

Breve introducción a los punteros en C


•  La variable que identifica a un vector, es un puntero del tipo
de datos del vector que apunta al comienzo del mismo

int a[4] = {1,2,3,4}; Variable Dirección Contenido


int * pint;
a[0] 10000 1
//Sin el & ya que a actua como puntero a[1] 10002 2
pint=a;
a[2] 10004 3
printf( “%d %d %d”,*pint,a[0],pint[1]);
a[3] 10006 4
//Imprime 1 1 2 por pantalla pint 10008 10000

Breve introducción a los punteros en C


•  Es posible definir strings (cadenas de texto) como punteros a char

char * str;
int i = 0;

Las dobles comillas crean la cadena (como un vector


de chars) en memoria y generan un puntero a la misma

str = “Esto es una cadena”;

//La cadena puede recorrerse como si fuera un vector


while(str[i] != ‘\0’) {
printf (“%c\n”,str[i]);
i++;
}

//Se imprime cada uno de los caracteres de la cadena


en una nueva linea

Breve introducción a los punteros en C


•  Se pueden aplicar cuatro operadores aritméticos a las variables de puntero:
+,++,-,--

•  Incrementan/decrementan la posición de memoria a la cual apunta el


puntero teniendo en cuenta el tipo de datos (enteros de 2bytes, 2 posiciones)

int a[4] = {1,2,3,4};


int * pint;
pint=a;
Variable Dirección Contenido
pint = pint + 2;
printf("%d",*pint); a[0] 10000 1
//Imprime 3 a[1] 10002 23
pint--; a[2] 10004 3
printf("%d",*pint);
//Imprime 2 a[3] 10006 4
pint 10008 10002
10004
10000
(*pint)++;
//*pint = *pint +1
printf("%d",*pint);
//Imprime 3

Breve introducción a los punteros en C


•  Por defecto en C el paso de una variable a una función (parámetro)
es por valor. Fuera de la función su contenido no es modificado

int mi_suma(int a, int b) {


a += 2; b *= 10;
return a+b;
}

void main(){
int a = 1, b = 2, total;
total = mi_suma(a,b);
printf(“%d %d %d”, total, a, b);
}

//Imprime en pantalla 22 1 2

Breve introducción a los punteros en C


•  Para poder pasar una variable por referencia y poder modificar su contenido
dentro de la función deben utilizarse punteros

Tanto a como b son punteros a


void Intercambio(int *a, int *b)
entero con lo cual representan
{ una dirección de memoria
int temp=*a;
*a=*b;
*b=temp; Copiamos el valor al cual
apunta a en una variable
}
Asignamos a *a el valor al temporal para no perderlo

void main() cual apunta b, y a *b el


valor almacenado en temp
{
int a=10,b=20;
Intercambio(&a,&b); Pasamos a la función las
} direcciones de memoria de a y b

Breve introducción a los punteros en C


•  Inicializar un vector de 10 enteros introducidos por el teclado

#define MAX 100;

void inicializar_vector (int * numeros, int max_elementos){


int i;
for (i=0; i<max_elementos; i++){
scanf("%d",numeros);
scanf(“%d”,&numeros[i]);
numeros++;
}
}

void main(){
int vector [MAX], tope = 10;
float media = 0.0;
inicializar_vector(vector, tope);
media = calcular_media(vector);
}

Breve introducción a los punteros en C


•  También es posible declarar punteros a estructuras. Útil para
evitar pasar por valor estructuras complejas

typedef struct { char primera_letra (persona * p1){


int edad; p1->nombre[0];
return (*p1).nombre[0];
int peso;
char * nombre; }
} persona;

persona Juan;
char c;

Juan.nombre = “Juan
Martinez”;
c = primera_letra (&Juan);

Breve introducción a los punteros en C


•  Libro: C, Guia de Autoenseñanza. Herbert Schildt, Ed Osborne/
McGraw-Hill

•  Tutorial On-line: Aprenda ANSI C como si estuviera en primero.


http://mec21.etsii.upm.es/ayudainf/aprendainf/AnsiC/leng_c.pdf

•  Tutorial punteros Avanzado: www.lugro.org.ar/biblioteca/


cursos/cursoc/Punteros.pdf

•  Listado de funciones ANSI C: http://www.conclase.net/c/


librerias/index.php

Breve introducción a los punteros en C

Potrebbero piacerti anche