Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61

Deprecated: substr(): Passing null to parameter #1 ($string) of type string is deprecated in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61
Atención, punteros
Source Code

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.

Xavier es un desarrollador senior full stack y opera desde la ciudad mediterránea de Barcelona. Le encantan las tecnologías de software y está convencido que el desarrollo de software es un proceso colaborativo y abierto.
Y es un apasionado de la astronomía y de la fotografía. Lo puedes encontrar en:
Comparte este post