P. 1
el lenguaje de programación c#

el lenguaje de programación c#

5.0

|Views: 5.908|Likes:
Publicado porinfobits

More info:

Published by: infobits on May 16, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/16/2013

pdf

text

original

Para definir una variable puntero de un determinado tipo se sigue una sintaxis parecida a
la usada para definir variables normales sólo que al nombre del tipo se le postpone un
símbolo de asterisco (*) O sea, un puntero se define así:

* ;

Por ejemplo, una variable puntero llamada a que pueda almacenar referencias a
posiciones de memoria donde se almacenen objetos de tipo int se declara así:

int * a;

En caso de quererse declarar una tabla de punteros, entonces el asterisco hay que
incluirlo tras el nombre del tipo pero antes de los corchetes. Por ejemplo, una tabla de
nombre t que pueda almacenar punteros a objetos de tipo int se declara así:

int*[] t;

Hay un tipo especial de puntero que es capaz de almacenar referencias a objetos de
cualquier tipo. Éstos punteros de declara indicando void como . Por ejemplo:

void * punteroACualquierCosa;

Hay que tener en cuenta que en realidad lo que indica el tipo que se dé a un puntero es
cuál es el tipo de objetos que se ha de considerar que se almacenan en la dirección de
memoria almacenada por el puntero. Si se le da el valor void lo que se está diciendo es
que no se desea que se considere que el puntero apunta a ningún tipo específico de
objeto. Es decir, no se está dando información sobre el tipo apuntado.

Se pueden declarar múltiples variables locales de tipo puntero en una misma línea. En
ese caso el asterisco sólo hay que incluirlo antes del nombre de la primera. Por ejemplo:

int * a, b; // a y b son de tipo int * No sería válido haberlas definido como int *a, *b;

Hay que tener en cuenta que esta sintaxis especial para definir en una misma definición
varios punteros de un mismo tipo sólo es válida en definiciones de variables locales. Al
definir campos no sirve y hay que dar para cada campo una definición independiente.

El recolector de basura no tiene en cuenta los datos a los que se referencie con punteros,
pues ha de conocer cuál es el objeto al referenciado por cada variable y un puntero en
realidad no tiene porqué almacenar referencias a objetos de ningún tipo en concreto. Por
ejemplo, pueden tenerse punteros int * que en realidad apunten a objeto char, o punteros
void * que no almacenen información sobre el tipo de objeto al que debería considerarse
que apuntan, o punteros que apunte a direcciones donde no hayan objetos, etc.

Como el recolector de basura no trabaja con punteros, no es posible definir punteros de
tipos que se almacenen en memoria dinámica o contengan miembros que se almacenen
en memoria dinámica, ya que entonces podría ocurrir que un objeto sólo referenciado a
través de punteros sea destruido por considear el recolector que nadie le referenciaba.
Por ello, sólo es válido definir punteros de tipos cuyos objetos se puedan almacenar

El lenguaje de programación C#

Tema 18: Código inseguro

José Antonio González Seco

Página 214

completamente en pila, pues la vida de estos objetos no está controlada por el recolector
de basura sino que se destruyen cuando se abandona el ámbito donde fueron definidos.

En concreto, los únicos punteros válidos son aquellos cuyo tipos sean tipos valor
básicos, enumeraciones o estructuras que no contengan campos de tipos referencias.
También pueden definirse punteros de tipos puntero, como muestra este ejemplo de
declaración de un puntero a puntero de tipo int llamando punteroApuntero:

int ** punteroApuntero;

Obviamente la anidación puede hacerse a cualquier nivel de profundidad, pudiéndose
definir punteros a punteros a punteros, o punteros a punteros a punteros a punteros, etc.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->