Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/main/articles.php on line 18
Atención, punteros
Tiempo de lectura: 1 minutos
Un puntero es una variable que apunta a algo, y para ello almacena la dirección de memoria de otra variable. Los punteros solo guardan direcciones de memoria.
Declarar un puntero
Declaramos los punteros con un asterisco delante del tipo de variable al que apuntan. De esta manera el puntero sabe dónde está guardada la dirección del primer byte de la variable.
var puntero_a_entero *int Utilizar el puntero
Para asignar una dirección de variable a un puntero necesitamos tener primero una variable de ese mismo tipo. A continuación, asignamos su dirección al puntero con &
var una_variable = 100
var direccion *int
direccion = &una_variable Y las direcciones y contenidos de las variables son:
fmt.Printf("Valor de 'una_variable': %d \n", mi_var)
fmt.Printf("Dirección en 'direccion': %x \n", dir_var)
fmt.Printf("Valor de la variable que apunta 'direccion': %d \n", *dir_var)
fmt.Printf("Dirección del puntero 'direccion' en memoria: %x \n", &dir_var) Da como salida:
Valor de 'una_variable': 100
Dirección en 'direccion': c00000a0c8
Valor de la variable que apunta 'direccion': 100
Dirección del puntero 'direccion' en memoria: c00005c020 Nulo (nil)
Cuando el apuntador tiene el valor nil, no es una dirección válida y entendemos que no está apuntando a nada y lo podemos utilizar como condición:
if (direccion == nil){
fmt.Println("Apunta a nil")
} Otras estructuras
Podemos utilizar el puntero dentro de otras estructuras de datos, como structs o vectores, siempre teniendo presente que en esos caso trabajaremos con las direcciones de las variabels apuntadas.
Por otra parte, se puede crear un puntero que apunte a otro puntero.
var variable int = 100
var puntero *int = nil
var puntero_a_puntero **int
puntero = &val
puntero_a_puntero = &puntero Y obtenemos el mismo valor en cada uno de los casos:
fmt.Printf("Variable: %d \n", variable)
fmt.Printf("Variable desde puntero: %d \n", *puntero)
fmt.Printf("Variable desde puntero de puntero: %d \n", **puntero_a_puntero) El resultado es:
Variable: 100
Variable desde puntero: 100
Variable desde puntero de puntero: 100 Parámetro por referencia
La manera en que pasamos argumentos a un función para que sea por referencia, es mediant un puntero. En el siguiente ejemplo, la función suma(a *int) no tiene un retorno porque se ha modificado la variable original.
var variable int = 10
suma(&variable)
fmt.Printf("variable = %d", int)
func suma(a *int){
*a = *a + 10
// no hay retorno porque se trabaja sobre la variable
} Ejemplos
Puedes ver un ejemplo de trabajo con punteros en la creación de una lista encadenada en memoria.