Punteros
Un puntero (pointer) es una variable o constante cuyo valor no es un dato directo, sino una dirección de memoria. Por eso decimos que “apunta” - no contiene el valor final, sino la ubicación.
Esa dirección normalmente señala un dato como un número, carácter, cadena, booleano etc.
Como ejemplo, aquí n_x contiene el número 42:
|
const n_x: u8 = 42; |
Pero en este otro caso:
|
const n_x: *const u8 = &42; |
Si imprimimos n_x, veremos algo como: u8@11961b5. Esto significa: “valor tipo u8 almacenado (@ = at) en la dirección de memoria 11961b5.
La declaración donde indicamos el tipo con *const u8 significa:
- * quiere decir puntero,
- const quiere decir puntero a dato no modificable,
- u8 es el tipo del dato en la dirección.
Ten en cuenta que const delante de n_x quiere decir que n_x es un valor constante - esto significa que una vez asignado, no puede apuntar a otra dirección, pero puede apuntar a una constante o variable.
Si queremos acceder al contenido en la dirección a la que apunta el puntero, ponemos un .* después del nombre:
|
print(“{}\n”, .{ n_x.* }); |
En nuestro caso, imprimirá un 42.
Este es un ejemplo de puntero apuntando a la dirección de una variable:
ptr2var.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { // definimos una variable var n_a: u8 = 42; // el puntero n_x es constante pero apunta // a una dirección que contiene una variable const n_x: *u8 = &n_a; // imprimimos el contenido de la dirección print("n_x: {}\n", .{n_x.*}); // incrementamos n_x.* += 1; // una vez más, imprimimos el contenido de la dirección print("n_x: {}\n", .{n_x.*}); } |
|
$ zig run ptr2var.zig |
|
n_x: 42 n_x: 43 |