asterisco

De ArduWiki
Revisión del 20:19 8 ago 2018 de Lucario448 (Discusión | contribuciones) (Descripción)

Saltar a: navegación, buscar

Descripción

El operador de asterisco (*) tiene dos funciones:

  1. Declarar variables como punteros de cierto tipo de dato.
  2. Desreferenciar; dicho en otras palabras, trabajar con el valor apuntado en vez del puntero en sí. Dicho valor dependerá del tipo de dato del puntero (es "interpretado" segun la posición de memoria dada).

Nota: A menos que el microcontrolador tenga más de 32 KB de SRAM, los punteros siempre serán variables enteras de 16 bits (el equivalente a word) independientemente del tipo que interpreten. De hecho también se pueden realizar las típicas operaciones matemáticas en punteros como cualquier otro tipo número-entero de variable conocido.


Sintaxis

variable1 = *variable2

Parámetros

variable1
*variable2


Comentarios

Los punteros son uno de los temas más complicados para los principiantes de Arduino y es posible escribir la gran mayoría de bocetos sin tener que encontrarse con los punteros. Sin embargo, para la manipulación de ciertas estructuras de datos, el uso de punteros puede simplificar el código, y el conocimiento de la manipulación de punteros es útil para tener en la propia caja de herramientas.

Bien usados, los punteros son excepcionalmente útiles para resolver cierto tipo de problemas, pero aprender a manejarlos puede provocar serios dolores de cabeza, especialmente cuando tratas de depurar un programa que se niega a funcionar como debe.

En primer lugar debemos entender que la memoria del Arduino está numerada en posiciones. Cada posición de memoria tiene una dirección única, que debe ser especificada cuando queremos leer o escribir su valor. Si miramos el tipo de memoria de los distintos Arduinos, vemos que, por ejemplo, el UNO dispone de 32 K de memoria flash para almacenamiento de programas y de 2 K de SRAM para almacenar de variables.

Cuando definimos una variable en el boceto, el compilador le asigna una posición en la memoria SRAM. Si la variables es del tipo char o byte asigna un byte de memoria, si es del tipo int o unsigned int le asigna dos posiciones de memoria y si es un tipo long o unsigned long le asigna 4 posiciones de memoria.

int numero;    //Declaramos variable
numero = 123;  //Definimos variable
Nombre Dirección de memoria Contenido
numero 2050 123

Esto nos da una idea de lo que puede suceder si escribimos un valor long en una dirección de memoria que corresponde a un int. Como el tipo long ocupa 4 bytes, cuando intentemos meterlos en una dirección a la que se ha asignado 2 bytes, va a ocupar el contenido de las siguientes posiciones de memoria, que pueden estar usadas por otros satos. Prueba esto:

void setup(){
   Serial.begin(115200);
   int numero;
   long n = 100000;
   numero = n;              //Estas intentando guardar 4 byte donde solo reservaste 2 bytes
   Serial.println(numero);  //-31072
}
void loop(){
   //Nada
}

Advertencias

  • Errores de overflow de registro no son advertidos por el compilador.

Ejemplo

byte *p; i=5, resultado;
p = &i;          //5
resultado = *p;  //resultado toma el valor de la posicion de memoria de p

Vea también

Referencias